Av8::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()
,而是someobj = someobj.destroy();
在 JS 中调用。
但这是有趣的部分。运行多次后,整台电脑都疯了。资源管理器窗口丢失字体,丢失窗口装饰,任务栏中的系统时间消失,开始菜单显示黑色矩形而不是图标。你给它命名。
为什么会这样?我应该如何将调用对象设置为 null 呢?