前言
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
- */