DÜZENLEME: Bu çıplak V8 olandan daha iyi bir yöntem MyObject::Init
olarak NanHasInstance
(https://github.com/rvagg/nan#api_nan_has_instance)
kullanmaktır:
Local<FunctionTemplate> tpl = NanNew<FunctionTemplate>(New);
tpl->SetClassName(NanNew<String>("MyObject"));
...
NanAssignPersistent(prototype, tpl);
prototype
statik olduğu üyesi, MyObject
. Böyle
Kullanım: Bu bir Düğüm addon yazma benim ilk ışığı olduğunu ihtar ile
if (NanHasInstance(prototype, handle)) {
MyObject* obj = ObjectWrap::Unwrap<MyObject>(handle);
...
}
, etrafta kendi wrapper ile nesnenin prototip kontrol ederek tam bu sorunu çözdü UnWrap
. Yalnızca fabrikada üretilen nesneler değil, kullanıcıların temel sınıfından diye bir yapıcı maruz olanları destekleyecek https://github.com/petli/node-addon-examples/commit/d3e92cd060a26da2623690718e78f9005db060a8
:
İşte yöntemini gösteren eklenti fabrika sınıfı demo için bir yama var. Bununla birlikte, bu prototip zincirinin yürümesiyle genelleştirilebilir.
Local<Object> obj = constructor->NewInstance();
prototype = Persistent<Value>::New(obj->GetPrototype());
Ve sonra nesneyi çözümleyecek önce kontrol eder: Özetle
, bu MyObject::Init
beklenen sınıf prototip referans tutunuyor
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;
}
Tüm fonksiyonlar daha sonra yerine CheckedUnWrap
kullanmak : Ben als
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>();
}
}
oldu o bir iç alan ekleyerek ve bazı sihirli işaretçilere göre ayarlamak, ancak daha sonra kod o iç alanların nasıl kullandığını değiştirmezdi node::ObjectWrap
değişmeyecektir.
Teşekkür
SonraWrapper::Init()
işlevinde, kamu Kalıcı nesne ayarlayın. Bu problemi tekrar gözden geçiriyorum ve cevabınız daha önce kabul edilen cevaptan "daha iyi". Yani seninkini kabul etmek – BigONotation