Implementing inheritance in node.js bindings

I am writing Node.js bindings around a C ++ library. I can identify key objects in the C ++ library, which I can present as classes for Node.js (i.e. derived ObjectWrap). I also see the relationship between these objects.

How can I open ClassA , ClassB , ClassC as Node.js classes (derived from ObjectWrap ) and manipulate their prototypes (in V8 C ++ code) so that ClassB and ClassC are derived from ClassA ?

+4
source share
1 answer

This can be done using the v8::FunctionTemplate Inherit method. He explained here . Here is a working example.

C ++ Code:

 #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); } 

Put it in the standard node-gyp configuration and you can test it with the following 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()); 
+3
source

Source: https://habr.com/ru/post/1469052/


All Articles