前言
functionTemplate 就是 JavaScript 中的 function,可以从 JS 直接指定执行某一个 c code function ,这就是JS Extension 的做法之一, FunctionTemplate 与 ObjectTemplate 都继承 Template 这个物仲,原因是在 Javascript 中,function 与 object 并没有明确的区分,基本上两个是共用的。
FunctionTemplate to ObjectTemplate
在 Javascript 中 ,function 是可以转成物件来使用,function to object,而在 v8 engine 也有同样的功能(functionTemplate to ObjectTemplate),所以之后提到的v8 ObjectTemplate 也可以由 functionTemplate 转变过来,是不是看得雾煞煞呢,我们先来看一段 简单的JS语法。
- function functionTemplate(){
- }
- var proto= functionTemplate.prototype;
- proto.vb=10;
- var object = new functionTemplate();
v8 的 FunctionTemplate 转 ObjectTemplate ,执行的结果与 JS的执行结果是相同的,都是宣告一个 function ,并指定一个属性值 vb=10,再用 InstanceTemplate 宣告成一个 object。
- Local<FunctionTemplate> t = FunctionTemplate::New();
- Local<Template> proto = t->PrototypeTemplate();
- proto->Set("vb",Number::New(10));
- Handle<ObjectTemplate> object;
- object= t.InstanceTemplate();
v8 prototype
上一段有用到 prototype的语法,prototype 就是定义 object 的基本属性、Method 有那些,这些由 prototype 定义的资料,是不存在於 function本身当中,所以直接执行 function是不会有作用的,只有透过 new 的方式,才能使用 prototype 的资料。
- var t=new Jackie_core();
- function fun(){
- var a=10;
- this.b=10;
- }
- var proto=fun.prototype;
- proto.c=10;
- var ob=new fun();
- Local<FunctionTemplate> fun = FunctionTemplate::New();
- t->Set(String::New('a'),10); //无法由 object 使用
- Local<Template> proto = fun->PrototypeTemplate();
- proto->Set("c",Number::New(10)); //正常由 proto 塞值
- Local<ObjectTemplate> global = t->InstanceTemplate();
functionTemplate 范例
即然 function and object 是同一种东西,那写法上就弹性很多了,这边 demo 一个简单的定义 objectTemplate 与 functionTemplate。
- #include <iostream>
- #include "v8.h"
- v8::Handle<v8::String> ReadFile(const char* name);
- int main (){
- Handle<ObjectTemplate> global;
- HandleScope handle_scope;
- Handle<Context> context;
- Local<FunctionTemplate> t = FunctionTemplate::New();
- t->Set("a",Number::New(10));
- Local<Template> proto = t->PrototypeTemplate();
- Local<FunctionTemplate> ob = FunctionTemplate::New();
- proto->Set("c",Number::New(10));
- proto->Set("newObject",ob);
- global = t->InstanceTemplate();
- context= Context::New(NULL,global);
- Context::Scope context_scope(context);
- Handle<v8::String> source = ReadFile("functionTemplate.js");
- Handle<Script> script = Script::Compile(source);
- Handle<Value> result = script->Run();
- String::Utf8Value str(result);
- script = Script::Compile(String::New("result"));
- result = script->Run();
- cout << *String::Utf8Value(result);
- return 0;
- }
- var s="";
- for(pro in __proto__){
- s+=pro+" ";
- }
- var result = s;
- /*
- 执行结果
- c newObject
- */
回應 (Leave a comment)