使用 Nan 检查 node.js 插件中的 instanceof
Checking instanceof in node.js addons using Nan
我试图在解包并开始使用之前验证传递给节点插件的对象的类型是否正确。这是我通过查看网络上的各种资源拼凑而成的解决方案。
持久数据:
Nan::Persistent<v8::Function> Event::constructor;
Nan::Persistent<v8::FunctionTemplate> Event::tpl;
初始化函数:
void Event::Init(v8::Local<v8::Object> exports) {
Nan::HandleScope scope;
// Prepare constructor template
v8::Local<v8::FunctionTemplate> ctor = Nan::New<v8::FunctionTemplate>(Event::New);
ctor->InstanceTemplate()->SetInternalFieldCount(1);
ctor->SetClassName(Nan::New("Event").ToLocalChecked());
// create a template for checking instances
Local<FunctionTemplate> localTemplate = Nan::New<FunctionTemplate>(Event::New);
localTemplate->SetClassName(Nan::New("Event").ToLocalChecked());
tpl.Reset(localTemplate);
// Statics
Nan::SetMethod(ctor, "x", Event::X);
// Prototype
Nan::SetPrototypeMethod(ctor, "addInfo", Event::addInfo);
Nan::SetPrototypeMethod(ctor, "toString", Event::toString);
constructor.Reset(ctor->GetFunction());
Nan::Set(exports, Nan::New("Event").ToLocalChecked(), ctor->GetFunction());
}
以及我尝试使用它的地方:
if (Nan::New(tpl)->HasInstance(info[0])) {
message = "it is an Event instance";
}
问题是 HasInstance()
永远不会 returns 正确。
JavaScript代码基本上就是
let e = new Event()
fn(e) // where fn performs the HasInstance() test.
没必要做第二个FunctionTemplate
。您在导出中设置的那个 (ctor
) 是您在 JS 中调用 new Event()
时使用的那个,而第二个 (localTemplate
) 被保存到 Event::tpl
并且是发出 HasInstance()
调用的那个。它们是不同的 FunctionTemplate
,所以 HasInstance()
调用 returns false
。
而不是这个:
...
Local<FunctionTemplate> localTemplate = Nan::New<FunctionTemplate>(Event::New);
localTemplate->SetClassName(Nan::New("Event").ToLocalChecked());
tpl.Reset(localTemplate);
...
试试这个:
...
tpl.Reset(ctor);
...
我试图在解包并开始使用之前验证传递给节点插件的对象的类型是否正确。这是我通过查看网络上的各种资源拼凑而成的解决方案。
持久数据:
Nan::Persistent<v8::Function> Event::constructor;
Nan::Persistent<v8::FunctionTemplate> Event::tpl;
初始化函数:
void Event::Init(v8::Local<v8::Object> exports) {
Nan::HandleScope scope;
// Prepare constructor template
v8::Local<v8::FunctionTemplate> ctor = Nan::New<v8::FunctionTemplate>(Event::New);
ctor->InstanceTemplate()->SetInternalFieldCount(1);
ctor->SetClassName(Nan::New("Event").ToLocalChecked());
// create a template for checking instances
Local<FunctionTemplate> localTemplate = Nan::New<FunctionTemplate>(Event::New);
localTemplate->SetClassName(Nan::New("Event").ToLocalChecked());
tpl.Reset(localTemplate);
// Statics
Nan::SetMethod(ctor, "x", Event::X);
// Prototype
Nan::SetPrototypeMethod(ctor, "addInfo", Event::addInfo);
Nan::SetPrototypeMethod(ctor, "toString", Event::toString);
constructor.Reset(ctor->GetFunction());
Nan::Set(exports, Nan::New("Event").ToLocalChecked(), ctor->GetFunction());
}
以及我尝试使用它的地方:
if (Nan::New(tpl)->HasInstance(info[0])) {
message = "it is an Event instance";
}
问题是 HasInstance()
永远不会 returns 正确。
JavaScript代码基本上就是
let e = new Event()
fn(e) // where fn performs the HasInstance() test.
没必要做第二个FunctionTemplate
。您在导出中设置的那个 (ctor
) 是您在 JS 中调用 new Event()
时使用的那个,而第二个 (localTemplate
) 被保存到 Event::tpl
并且是发出 HasInstance()
调用的那个。它们是不同的 FunctionTemplate
,所以 HasInstance()
调用 returns false
。
而不是这个:
...
Local<FunctionTemplate> localTemplate = Nan::New<FunctionTemplate>(Event::New);
localTemplate->SetClassName(Nan::New("Event").ToLocalChecked());
tpl.Reset(localTemplate);
...
试试这个:
...
tpl.Reset(ctor);
...