在node.js绑定中实现inheritance
我正在编写一个C ++库的Node.js绑定。 我可以识别C ++库中的关键对象,我可以将其公开为Node.js(即ObjectWrap的派生类)的类。 我也可以看到这些对象之间的inheritance关系。
如何将ClassA
, ClassB
, ClassC
为node.js类( ObjectWrap
衍生物)并操作它们的原型(在V8 C ++代码中),以便ClassB
和ClassC
是ClassA
衍生物?
这可以使用v8::FunctionTemplate
的Inherit
方法来完成。 这里解释。 这是一个工作的例子。
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-gyp
configuration中,你可以用下面的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());
- 问题获取Node.js Express 3.x模板inheritance与Swig通过consolidate.js
- 节点js原型对象'self'var不存储正确的callback上下文
- util.inherits – 如何调用超级实例的方法?
- Node.JS中的inheritance
- 在mongoose的inheritance
- Javascriptinheritance对象覆盖其他inheritance对象
- JavaScriptinheritance框架
- 使用TypeScriptinheritance不起作用浏览器端
- 为什么console.log()不显示Object.create的inheritance属性?