v8::Handle<v8::Object>
打包包含其部分成员的本机类。这就是它的工作方式:
someobj = window.createNewWrappedClassObject();
[object Object] { fn1:[function], fn2:[function] .... destroy:[function] };
someobj.fn1(); [...] // do something with someobj
someobj.destroy(); // when done, call destroy(). now someobj not only would be
// inoperable, it would also get set to {} or null or etc.
someobj.fn1()
,someobj.fn2()
,someobj.destroy()
是包装函数。构造函数中的初始化逻辑如下所示:
WrappedClass::GetWrappedObject(){
Local<ObjectTemplate> objectTemplate = ObjectTemplate::New();
objectTemplate->SetInternalFieldCount(1);
this->instance = objectTemplate->NewInstance();
this->instance->SetPointerInInternalField(0, this);
this->instance->Set(String::New("fn1"),
FunctionTemplate::New(Fn1)->GetFunction());
[...] // so on
}
现在的问题是,在调用destroy()
时,我想要做的基本上是强制所有对该对象的引用变为null
。所以这就是我的想法:
Handle<Value> WrappedClass::Fn1(const Arguments& args){
WrappedClass * CurrentInstance =
static_cast<WrappedClass *>(args.This()->GetPointerFromInternalField(0));
CurrentInstance->~WrappedClass();
CurrentInstance->instance->Clear(); // tricky part right here and
args.This()->Clear(); // also here on these two lines
return v8::Null();
}
会发生什么?什么都没发生,函数永远不会真正返回。我通过不调用->Clear()
来修复此问题,而是在JS中执行someobj = someobj.destroy();
。
但这是有趣的部分。多次运行后,整台电脑都疯了。资源管理器窗口丢失字体,失去窗口装饰,任务栏中的系统时间消失,开始菜单显示黑色矩形而不是图标。你的名字。
为什么会这样?我怎么把调用对象设置为null呢?