V8嵌入开发(五)

Template

object 和 function 模板的基类

Templates用于在C++中自定义一个JS函数。它有两种类型:

  1. Function Template: 用于生成JS函数的C++对象。
  2. Object Template: 每一个Function Template都有一个对应的Object Template。当一个Function Template对应的JS函数被当作构造器创建对象时,V8会实际使用Object Template来实例化此对象。

FunctionTemplate

FunctionTemplate 是用来在运行时创建函数。只允许在一个Context 上下文中创建 FunctionTemplate。并且这个创建后的函数生命周期跟随 Context 。故,在创建函数时, FunctionTemplate 是首选。

FunctionTemplate 在初始化后,对其做的任何修改都会触发崩溃。

FunctionTemplate可以具有属性,这些属性在创建时会添加到函数对象中。

FunctionTemplate具有一个相应的实例模板,当该函数用作构造函数时,该模板用于创建对象实例。添加到实例模板的属性将添加到每个对象实例。

FunctionTemplate可以具有原型模板。原型模板用于创建函数的原型对象。

创建 FunctionTemplate

v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate);
Local<Template> proto = t->PrototypeTemplate();
proto->Set(isolate, "vb",Number::New(10));
 
Handle<ObjectTemplate> object = t.InstanceTemplate();

上面这段C++代码,等价于以下JS代码

function functionTemplate(){
 
}
var proto= functionTemplate.prototype;
proto.vb=10;
 
var object = new functionTemplate();

注意:此时,C++代码所定义的FunctionTemplate并不在任何一个Context中,如果要在JS中使用它,可以做如下修改

v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate);
Local<Template> proto = t->PrototypeTemplate();
proto->Set("vb",Number::New(10));

Local<ObjectTemplate> global = ObjectTemplate::New(isolate);
global->Set(isolate, "functionTemplate", t);

v8::Local<v8::Context> context = Context::New(GetIsolate(), NULL, global);

这样,在Context中有一个全局对象,这个对象里定义了一个名称为“functionTemplate”的函数。

var object = new functionTemplate(); //JS中可直接使用

函数体

void Func(const v8::FunctionCallbackInfo<v8::Value>& args){
    //args->Length() 参数的长度
    //args->This() 当前函数域中的this对象
    //args->isConstructCall() 判定当前是否为构造调用,如果为false,表示常规调用
}

v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate, Func);

当JS层调用这个函数定义时,C++层会调用 Func 函数。args本身是一个数组,可以通过args[0]的方式访问函数的参数。

设置函数返回值

void Version(const v8::FunctionCallbackInfo<v8::Value>& args) {
      args.GetReturnValue().Set(v8::String::NewFromUtf8(args.GetIsolate(), v8::V8::GetVersion()).ToLocalChecked());
}

如果函数需要返回值,可调用 args.GetReturnValue() 得到一个类型为 v8::ReturnValue< T > 的对象,将返回值写入到该对象内即可。

其他关键接口

ObjectTemplate

ObjectTemplate用于在运行时创建对象。

添加到ObjectTemplate的属性将添加到从ObjectTemplate创建的每个对象中。

创建一个ObjectTemplate

static Local<ObjectTemplate> v8::ObjectTemplate::New(Isolate * isolate,
    Local< FunctionTemplate > constructor = Local< FunctionTemplate >() 
    )