在我目前正在研究的C ++ NodeJS项目中,我想要一个包含嵌套对象的对象,例如
console.log(object.myObject); // { [keys: string]: any }
在没有将对象绑定到属性的情况下,我的插件运行得很好。我用
创建实例auto ctor = Nan::New<v8::FunctionTemplate>(New);
auto ctorInst = ctor->InstanceTemplate();
并将对象绑定到类实例上
v8::Local<v8::Object> obj = Nan::New<v8::Object>();
ctorInst->Set(Nan::New("myObject").ToLocalChecked(), obj);
在执行JS代码(创建C ++扩展实例)时显示以下内容。
第0行出现#个致命错误
#检查失败:!value_obj-> IsJSReceiver()|| value_obj-> IsTemplateInfo()。
另一方面,绑定原语(数字,字符串等)可以完美地工作。
ctorInst->Set(Nan::New("myObject").ToLocalChecked(), Nan::New<v8::Number>(42));
您有什么建议吗?谢谢,加油!
答案 0 :(得分:1)
所有模板(包括InstanceTemplate的模板)中只能有其他模板或基元。如您所见,IsTemplateInfo
是错误的,应该是正确的。 here提出并回答了类似的问题。只需制作一个ObjectTemplate,然后像使用FunctionTemplate
一样填充它即可。
仅当实例化模板(使用GetFunction
)时,才能使用实际对象填充模板。
答案 1 :(得分:0)
除了尼古拉斯的回答,我还要添加以下内容。
实例
只需将v8::Object
替换为v8::ObjectTemplate
。将属性设置为对象模板,然后将模板绑定到插件实例。
v8::Local<v8::ObjectTemplate> objTemplate = Nan::New<v8::ObjectTemplate>();
objTemplate->Set(Nan::New("prop").ToLocalChecked(), Nan::New<v8::Number>(42));
ctorInst->Set(Nan::New("myObject").ToLocalChecked(), objTemplate);
现在您可以使用
console.log(addonInstance.myObject); // { prop: 42 }
原型
如果要将功能绑定到对象,请像上面一样创建对象模板。然后从现有的cpp函数创建函数模板,并将其绑定到对象模板的对象属性。然后在插件实例原型上创建一个模板。
v8::Local<v8::ObjectTemplate> objTemplate = Nan::New<v8::ObjectTemplate>();
objTemplate->Set(Nan::New("prop").ToLocalChecked(), Nan::New<v8::Number>(42));
auto fn = Nan::New<v8::FunctionTemplate>(setup);
objTemplate->Set(Nan::New("setup").ToLocalChecked(), fn);
Nan::SetPrototypeTemplate(ctor, "myObj", objTemplate);
设置功能很简单
NAN_METHOD(YourClass::setup) {
info.GetReturnValue().Set(Nan::New<v8::String>("Hello world").ToLocalChecked());
}
控制台输出为
console.log(addonInstance.myObject) // { prop: 42, setup: [Function: setup] }