在node.js绑定中实现继承

时间:2013-03-13 19:03:21

标签: c++ node.js v8 prototypal-inheritance

我正在围绕C ++库编写Node.js绑定。我可以识别C ++库中的关键对象,我可以将它作为类暴露给Node.js(即ObjectWrap的衍生物)。我还可以看到这些对象之间的继承关系。

如何将ClassAClassBClassC公开为node.js类(ObjectWrap的衍生物)并操纵其原型(在v8 C ++代码中),以便ClassBClassCClassA

的衍生物

1 个答案:

答案 0 :(得分:3)

可以使用v8::FunctionTemplate的{​​{1}}方法完成此操作。它解释了here。这是一个有效的例子。

C ++代码:

Inherit

将其置于标准#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); } 配置中,您可以使用以下javascript进行测试

node-gyp