gpt4 book ai didi

c++ - 在 node.js 绑定(bind)中实现继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:48 24 4
gpt4 key购买 nike

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

如何将 ClassAClassBClassC 公开为 node.js 类(ObjectWrap 的派生类)并操作它们的原型(prototype)(在 v8 C++ 代码中)以便 ClassBClassCClassA 的派生?

最佳答案

这可以使用 v8::FunctionTemplateInherit 方法来完成。解释了here .这是一个工作示例。

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());

关于c++ - 在 node.js 绑定(bind)中实现继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15394176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com