在不经过构造函数的情况下包装C ++对象

时间:2018-02-04 17:08:44

标签: c++ node.js v8

我有一个继承自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());

0 个答案:

没有答案