Проверка 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);
...