В настоящее время я работаю над расширением NodeJS C ++, используя нативные абстракции для nodejs. Все работает и компилируется очень хорошо, я могу определить Nan::SetPrototypeMethod()
с и Nan::DefineOwnProperty()
и использовать их в JavaScript. Из-за большого количества функций и свойств, определенных для этого объекта, я хочу реализовать вложенную структуру для этого объекта js, которая позволяет пользователю использовать объект следующим образом
const obj = new MyObject();
obj.directFunction(); // working
obj.subclass.childFunction();
Мое расширение C ++ выглядит следующим образом. Точка входа addon.cc
#include <nan.h>
#include "myAddon.h"
NAN_MODULE_INIT(InitAll) {
MyAddon::Init(target);
}
NODE_MODULE(addon, InitAll)
myAddon.h
#ifndef MYADDON_H
#define MYADDON_H
#include <nan.h>
#include "subClass.h"
class MyAddon: public Nan::ObjectWrap {
public:
static NAN_MODULE_INIT(Init);
private:
static NAN_METHOD(New); //constructor
static NAN_METHOD(directFunction);
MyAddon();
};
И В этом функция в myAddon.cc похоже
NAN_MODULE_INIT(MyAddon::Init) {
auto cname = Nan::New("MyAddon").ToLocalChecked();
auto ctor = Nan::New<v8::FunctionTemplate>(New);
auto ctorInst = ctor->InstanceTemplate();
ctor->SetClassName(cname);
ctorInst->SetInternalFieldCount(1);
Nan::SetPrototypeMethod(ctor, "directFunction", directFunction);
// Working
Nan::SetPrototypeTemplate(ctor, "subclass", Nan::New<v8::Object>());
// Trying to bind another class to "subclass" does not work
Nan::SetPrototypeTemplate(ctor, "subclass", SubClass);
// Also tested SubClass in a similar way with NAN_MODULE_INIT(Init) and NAN_METHOD(New) functions and use
SubClass::Init(ctor)
// which leads to
// cannot convert from 'v8::FunctionTemplate *' to 'v8::Object *volatile '
Nan::Set(target, cname, Nan::GetFunction(ctor).ToLocalChecked());
}
subClass.h наследуется Nan::ObjectWrap
и выглядит как
#ifndef SUBCLASS_H
#define SUBCLASS_H
#include <nan.h>
class SubClass : public Nan::ObjectWrap {
private:
// same as: static NAN_METHOD(childFunction)
static void childFunction(const Nan::FunctionCallbackInfo<v8::Value>& info);
public:
SubClass(const Nan::FunctionCallbackInfo<v8::Value>& info);
};
#endif
Также я протестировал SubClass, похожий на MyAddon, включая методы New и Init, но ни один из них не работает. Есть ли у вас какие-либо идеи или предложения? Спасибо и ура!
Задача ещё не решена.
Других решений пока нет …