我有一个继承自node::ObjectWrap
的C ++对象。对象本身管理资源,因此它将其作为私有构造函数中的参数接受。
当从Javascript创建对象时,它非常简单:
void New(const v8::FunctionCallbackInfo<v8::Value>& args) {
// ...
auto handleToCustomResource = resolveFromJSArg(args[0]->ToString());
auto object = new MyObjectWrap(handleToCustomResource);
object->Wrap(args.This());
args.GetReturnValue().Set(args.This());
}
然而,当它来自C ++时,如何包装对象并不清楚,这是我最近的努力:
public v8::Local<v8::Object> CreateObject(v8::Isolate *isolate, const char *name) {
v8::Local<v8::Context> context = isolate->GetCurrentContext();
v8::EscapableHandleScope scope(isolate);
auto object = new MyObjectWrap(handleToMyCustomResource);
v8::Local<v8::Object> instance = // eh don't have an instance??
object->Wrap(instance);
return scope.Escape(instance);
}
如何正确创建JS对象,以便将其用作我的本机对象的实例?
我发现的一个解决方法是基本上有两个构造函数,一个是public,一个是private,然后从另一个继承。 public可以在javascript中使用,而private只用于创建一个包装现有ObjectWrap对象的实例。
v8::Local<v8::FunctionTemplate> privTpl = v8::FunctionTemplate::New(isolate, PrivateNew);
v8::Local<v8::FunctionTemplate> pubTpl = v8::FunctionTemplate::New(isolate, New);
// define prototype
pubTpl->Inherit(privTpl);
exports->Set(v8::String::NewFromUtf8(isolate, "MyObject"), tpl->GetFunction());