当删除暴露给v8的C ++对象时,如何使可能指向此对象的句柄无效。
我正在使用v8作为更大应用程序的脚本接口。使用节点的ObjectWrap类在v8中包装和访问较大应用程序中的对象。
问题是,包装对象的生命周期是有限的。如果在javascript中执行类似的操作:
var win = app.getWindow();
win.close(); // The C++ object that win references goes away
console.log(win.width()); // This should fail.
我希望它的行为就像评论所说的那样。在win.close()之后(或者某些其他事件可能在JS控件之外),对win或duplicated句柄的任何访问都需要失败。
目前,我必须将包装的C ++对象标记为无效,并检查每个方法调用的有效性。这是唯一的方法,还是有办法将句柄标记为不再有效?
答案 0 :(得分:1)
想到的唯一方法是有一个额外的函数,在调用时会产生错误。然后,当您调用'.close'时,您可以在win
上创建优先于对象原型版本的属性。
function closedError() {
return new Error("Window Closed");
}
win.close = function() {
this.width = closedError;
this.otherfunc = closedError;
};
我目前没有编译器方便,但我想象C ++中有这样的东西。
static Handle<Value> Close(const Arguments& args) {
HandleScope scope;
NODE_SET_METHOD(args.This(), "width", Window::Width);
NODE_SET_METHOD(args.This(), "otherfunc", Window::OtherFunc);
}