使用NAN在node.js插件中检查实例



我试图验证将对象传递给节点addon之前的类型是正确的类型,然后才能开始使用它并开始使用它。这是我从网络上查看各种来源拼凑在一起的解决方案。

持续数据:

Nan::Persistent<v8::Function> Event::constructor;
Nan::Persistent<v8::FunctionTemplate> Event::tpl;

init函数:

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()永远不会返回。

JavaScript代码基本上是

let e = new Event()
fn(e)     // where fn performs the HasInstance() test.

无需制作第二个FunctionTemplate。您在导出上设置的一个(ctor)是在JS中调用new Event()时使用的,而第二个(localTemplate)将保存到Event::tpl,并且是 HasInstance()呼叫的一个。它们是不同的FunctionTemplate s,因此HasInstance()调用返回false

而不是这样:

...
Local<FunctionTemplate> localTemplate = Nan::New<FunctionTemplate>(Event::New);
localTemplate->SetClassName(Nan::New("Event").ToLocalChecked());
tpl.Reset(localTemplate);
...

只需尝试一下:

...
tpl.Reset(ctor);
...

相关内容

  • 没有找到相关文章

最新更新