Предположим, у меня есть класс C ++:
class cClass {
public:
methodA();
methodB();
private:
//private stuff
}
Я могу привязать этот класс к Node двумя способами:
Метод I — наследование node :: objectWrap напрямую
class cClass : public node::ObjectWrap {
public:
static void Init(v8::Handle<v8::Object> exports);
methodA();
methodB();
private:
static v8::Handle<v8::Value> New(const v8::Arguments& args);
//private stuff
}
Таким образом, я редактирую структуру класса напрямую. Но есть более простой способ, и это:
Метод II — сохранение ссылки на оригинальный класс внутри
class cClassWrapper : public node::ObjectWrap {
public:
static void Init(v8::Handle<v8::Object> exports);
private:
static v8::Handle<v8::Value> New(const v8::Arguments& args);
cClass internal_;
}
Обратите внимание на метод II cClassWrapper
имеет только одно внутреннее поле, и это internal_
, Просто cClassWrapper
пользователь cClass
и внутренности cClass
нетронутым
Очевидно, что метод II проще реализовать, так как структура класса cClass
не тронут, но мне интересно, в чем его минус (если есть?). Удаляет ли сборщик мусора в v8 internal_
когда я прохожу cClassWrapper
вокруг?
Я не уверен, каковы различия между этими двумя реализациями.
Параметр секунд, как правило, лучше с точки зрения архитектуры: вы получаете класс, полностью отделенный от v8. Затем его можно переместить в какую-нибудь внешнюю библиотеку, вы можете независимо отслеживать изменения (используя git или другие vcs) реализации и привязок и т. Д.
Недостатком является потенциальное снижение производительности, которое, вероятно, незначительно. Это никак не влияет на поведение сборщика мусора, все поля ObjectWrap
управляются ObjectWrap
реализация.