[英]Implementing inheritance in node.js bindings
我正在圍繞C ++庫編寫Node.js綁定。 我可以識別C ++庫中的關鍵對象,我可以將它作為類暴露給Node.js(即ObjectWrap的衍生物)。 我還可以看到這些對象之間的繼承關系。
我如何將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
配置中,您可以使用以下javascript進行測試
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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.