假设我有一个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
是[{1}}的用户,cClass
的内部未受影响。
显然,方法II更容易实现,因为cClass
的类结构没有被触及,但我想知道它的缺点是什么(如果有的话)?当我传递cClass
时,v8的垃圾收集器是否会一直删除internal_
?
我不确定两种实现之间的区别是什么。
答案 0 :(得分:1)
在架构方面,秒选项通常更好:你得到一个与v8完全分离的类。然后可以将其移动到某个外部库,您可以独立跟踪实现和绑定的更改(使用git或其他vcs)等。
缺点是潜在的业绩下降,这可能是微不足道的。这根本不会影响垃圾收集器的行为,ObjectWrap
的所有字段都由ObjectWrap
实现管理。