EDIT:以下裸V8のものよりもより良い方法は、MyObject::Init
でNanHasInstance
(https://github.com/rvagg/nan#api_nan_has_instance)
を使用することである:
prototype
が静的である
Local<FunctionTemplate> tpl = NanNew<FunctionTemplate>(New);
tpl->SetClassName(NanNew<String>("MyObject"));
...
NanAssignPersistent(prototype, tpl);
Persistent<FunctionTemplate>
メンバーのMyObject
。このような
使用:これはノードのアドオンを書く時、私の最初の行くであることを警告して
if (NanHasInstance(prototype, handle)) {
MyObject* obj = ObjectWrap::Unwrap<MyObject>(handle);
...
}
、私の周りに私自身のラッパーを持つオブジェクトのプロトタイプをチェックして、この正確な問題を解決しましたUnWrap
。それが唯一の工場出荷時に生成されたオブジェクトではなく、ユーザーが基本クラスから継承することができるようにコンストラクタが露出しているものをサポートしています https://github.com/petli/node-addon-examples/commit/d3e92cd060a26da2623690718e78f9005db060a8
:
は、ここでの方法を示すアドオンファクトリクラスのデモへのパッチです。しかし、それはプロトタイプチェーンを歩くことによって一般化することができます。
Local<Object> obj = constructor->NewInstance();
prototype = Persistent<Value>::New(obj->GetPrototype());
をし、オブジェクトを逆参照する前にいることを確認します:要約すると
は、それがMyObject::Init
に予想されるクラスのプロトタイプへの参照のホールドをつかむ
MyObject* MyObject::CheckedUnWrap(Handle<Object> handle)
{
if (!handle.IsEmpty() && handle->InternalFieldCount() == 1) {
Handle<Value> objproto = handle->GetPrototype();
if (objproto == prototype) {
// OK, this is us
return ObjectWrap::Unwrap<MyObject>(handle);
}
}
ThrowException(Exception::TypeError(String::New("<this> is not a MyObject")));
return NULL;
}
すべての機能が、代わりにCheckedUnWrap
を使用します:
Handle<Value> MyObject::PlusOne(const Arguments& args) {
HandleScope scope;
MyObject* obj = CheckedUnWrap(args.This());
if (obj) {
obj->counter_ += 1;
return scope.Close(Number::New(obj->counter_));
}
else {
// Invalid type, an exception has been thrown so return an empty value
return Handle<Value>();
}
}
私はo内部フィールドを追加してそれをある種の魔法のポインタに設定することを検討したが、コードはnode::ObjectWrap
が内部フィールドの使い方を変更しないということに依存していました。
感謝を
は、その後、あなたの
Wrapper::Init()
機能では、公共の永続オブジェクトを設定します。私はこの問題を再検討しており、あなたの答えは、以前に受け入れられた答えよりも「良い」ことが分かります。だからあなたを受け入れる – BigONotation