继承节点::objectWrap与类包装器

Inhering node::objectWrap vs class wrapper

本文关键字:包装 objectWrap 节点 继承      更新时间:2023-10-16

假设我有一个c++类:

class cClass {
public:
    methodA();
    methodB();
private:
    //private stuff
}
我可以用两种方式将这个类绑定到Node:

方法一-直接继承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_。简单地说,cClassWrappercClass的用户,cClass的内部不受影响。

显然方法II更容易实现,因为cClass的类结构是不变的,但我想知道它的缺点是什么(如果有的话?)。当我传递cClassWrapper时,v8的垃圾收集器是否一直在删除internal_ ?

我不确定这两种实现之间的区别是什么

第二个选项通常在架构方面更好:您将获得一个与v8完全解耦的类。然后它可以移动到一些外部库,你可以独立地跟踪实现和绑定的变化(使用git或其他vcs),等等。

缺点是潜在的性能下降,这可能可以忽略不计。这根本不影响垃圾收集器的行为,ObjectWrap的所有字段都由ObjectWrap实现管理。