在node.js绑定中实现inheritance

我正在编写一个C ++库的Node.js绑定。 我可以识别C ++库中的关键对象,我可以将其公开为Node.js(即ObjectWrap的派生类)的类。 我也可以看到这些对象之间的inheritance关系。

如何将ClassAClassBClassC为node.js类( ObjectWrap衍生物)并操作它们的原型(在V8 C ++代码中),以便ClassBClassCClassA衍生物?

这可以使用v8::FunctionTemplateInherit方法来完成。 这里解释。 这是一个工作的例子。

C ++代码:

 #include <v8.h> #include <node.h> using namespace node; using namespace v8; class BaseClass : ObjectWrap { public: static Persistent<FunctionTemplate> s_ct; static void Init(v8::Handle<Object> target) { Local<FunctionTemplate> t = FunctionTemplate::New(New); s_ct = Persistent<FunctionTemplate>::New(t); s_ct->InstanceTemplate()->SetInternalFieldCount(1); s_ct->SetClassName(String::NewSymbol("BaseClass")); NODE_SET_PROTOTYPE_METHOD(s_ct, "getName", getName); target->Set(String::NewSymbol("BaseClass"), s_ct->GetFunction()); } BaseClass(){} ~BaseClass(){} static v8::Handle<Value> New(const Arguments& args) { HandleScope scope; return args.This(); } static v8::Handle<Value> getName(const Arguments& args) { HandleScope scope; return scope.Close(String::New("Base")); } }; Persistent<FunctionTemplate> BaseClass::s_ct; class DerivedClass : ObjectWrap { public: static Persistent<FunctionTemplate> s_ct; static void Init(v8::Handle<Object> target) { Local<FunctionTemplate> t = FunctionTemplate::New(New); s_ct = Persistent<FunctionTemplate>::New(t); // XXX Inherit from BaseClass s_ct->Inherit(BaseClass::s_ct); s_ct->InstanceTemplate()->SetInternalFieldCount(1); s_ct->SetClassName(String::NewSymbol("DerivedClass")); NODE_SET_PROTOTYPE_METHOD(s_ct, "getAge", getAge); target->Set(String::NewSymbol("DerivedClass"), s_ct->GetFunction()); } DerivedClass() {} ~DerivedClass() {} static v8::Handle<Value> New(const Arguments& args) { HandleScope scope; return args.This(); } static v8::Handle<Value> getAge(const Arguments& args) { HandleScope scope; return scope.Close(Number::New(42)); } }; Persistent<FunctionTemplate> DerivedClass::s_ct; extern "C" { static void init (v8::Handle<Object> target) { BaseClass::Init(target); DerivedClass::Init(target); } NODE_MODULE(mymodule, init); } 

把它放在标准的node-gypconfiguration中,你可以用下面的javascript来testing它

 var mymodule = require('./build/Release/mymodule'); var baseObject = new mymodule.BaseClass(); var dervObject = new mymodule.DerivedClass(); console.log(baseObject.getName()); console.log(dervObject.getName(), dervObject.getAge());