Проверка instanceof в аддонах node.js с использованием Nan

Я пытаюсь проверить, что объект, переданный аддону узла, имеет правильный тип, прежде чем развернуть его и начать его использовать. Вот решение, которое я собрал вместе, просматривая различные источники в Интернете.

Постоянные данные:

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.

2 ответа

Попробуйте использовать Nan::New(Event::constructor)->HasInstance(info[0]) вместо FunctionTemplate, В противном случае это выглядит правильно. Вам может понадобиться info[0]->ToObject() - Я забыл, если это требуется.

Нет необходимости делать второй FunctionTemplate, Тот, который вы установили на экспорт (ctor) тот, который используется, когда вы звоните new Event() в JS пока второй (localTemplate) сохраняется в Event::tpl и это тот, из которого HasInstance() звонок сделан. Они разные FunctionTemplateс, так что HasInstance() возврат звонка false,

Вместо этого:

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

просто попробуйте это:

...
tpl.Reset(ctor);
...
Другие вопросы по тегам