A闪的 BLOG 技术与人文
object 和 function 模板的基类
Templates用于在C++中自定义一个JS函数。它有两种类型:
FunctionTemplate 是用来在运行时创建函数。只允许在一个Context 上下文中创建 FunctionTemplate。并且这个创建后的函数生命周期跟随 Context 。故,在创建函数时, 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创建的每个对象中。
static Local<ObjectTemplate> v8::ObjectTemplate::New(Isolate * isolate,
Local< FunctionTemplate > constructor = Local< FunctionTemplate >()
)