संपादित करें: नीचे नंगे वी 8 एक से एक बेहतर तरीका NanHasInstance
(https://github.com/rvagg/nan#api_nan_has_instance)
उपयोग करने के लिए MyObject::Init
में है:
Local<FunctionTemplate> tpl = NanNew<FunctionTemplate>(New);
tpl->SetClassName(NanNew<String>("MyObject"));
...
NanAssignPersistent(prototype, tpl);
जहां prototype
एक स्थिर है Persistent<FunctionTemplate>
MyObject
के सदस्य। इस तरह
उपयोग:
if (NanHasInstance(prototype, handle)) {
MyObject* obj = ObjectWrap::Unwrap<MyObject>(handle);
...
}
चेतावनी है कि यह एक नोड ऐड-ऑन लेखन में मेरी पहली जाने है साथ
, मैं चारों ओर मेरे अपने आवरण के साथ वस्तु के प्रोटोटाइप की जाँच करके इस सटीक समस्या हल UnWrap
। https://github.com/petli/node-addon-examples/commit/d3e92cd060a26da2623690718e78f9005db060a8
यह केवल कारखाने में उत्पन्न वस्तुओं, और नहीं, जहां एक निर्माता सामने आ रहा है, ताकि उपयोगकर्ताओं को आधार वर्ग से विरासत सकता है लोगों का समर्थन करेंगे:
यहाँ विधि दिखा ऐड-ऑन कारखाने वर्ग डेमो के लिए एक पैच है। हालांकि, प्रोटोटाइप श्रृंखला चलकर इसे सामान्यीकृत किया जा सकता है।
सारांश में, यह MyObject::Init
में उम्मीद वर्ग प्रोटोटाइप के संदर्भ में की पकड़ पकड़ लेता:
Local<Object> obj = constructor->NewInstance();
prototype = Persistent<Value>::New(obj->GetPrototype());
और फिर जाँच करता है कि वस्तु अपसंदर्भन से पहले:
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