2011
Dec
29

前言

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語法。

JS 的 function 轉 object 範例
  1. function functionTemplate(){
  2.  
  3. }
  4. var proto= functionTemplate.prototype;
  5. proto.vb=10;
  6.  
  7. var object = new functionTemplate();

v8 的 FunctionTemplate 轉 ObjectTemplate ,執行的結果與 JS的執行結果是相同的,都是宣告一個 function ,並指定一個屬性值 vb=10,再用 InstanceTemplate 宣告成一個 object。

Example
  1. Local<FunctionTemplate> t = FunctionTemplate::New();
  2. Local<Template> proto = t->PrototypeTemplate();
  3. proto->Set("vb",Number::New(10));
  4.  
  5. Handle<ObjectTemplate> object;
  6. object= t.InstanceTemplate();

v8 prototype

上一段有用到 prototype的語法,prototype 就是定義 object 的基本屬性、Method 有那些,這些由 prototype 定義的資料,是不存在於 function本身當中,所以直接執行 function是不會有作用的,只有透過 new 的方式,才能使用 prototype 的資料。

看一下這段 JS語法,在 objcet ob中, b 和 c 是存在的值,而 a 是不屬於 ob 的屬性,a 這個變數只單純的存在於 fun()中,不存在 object fun()裡。
Example
  1. var t=new Jackie_core();
  2.  
  3. function fun(){
  4. var a=10;
  5. this.b=10;
  6. }
  7.  
  8. var proto=fun.prototype;
  9. proto.c=10;
  10. var ob=new fun();
Google v8 Engine Prototype ,定義一個 function,並塞入變數 a ,再由 prototype 塞入變數值 c , 其中 a 是無法透過 objectTemplate 來操作。
Example
  1. Local<FunctionTemplate> fun = FunctionTemplate::New();
  2. t->Set(String::New('a'),10); //無法由 object 使用
  3. Local<Template> proto = fun->PrototypeTemplate();
  4. proto->Set("c",Number::New(10)); //正常由 proto 塞值
  5. Local<ObjectTemplate> global = t->InstanceTemplate();

functionTemplate 範例

即然 function and object 是同一種東西,那寫法上就彈性很多了,這邊 demo 一個簡單的定義 objectTemplate 與 functionTemplate。

c++ 語法 ,在 functionTemplate 中由 prototype 宣告一個變數 c 與一個 object newObject ,再將 functionTemplate 轉成 ObjectTemplate
Example
  1. #include <iostream>
  2. #include "v8.h"
  3. v8::Handle<v8::String> ReadFile(const char* name);
  4. int main (){
  5. Handle<ObjectTemplate> global;
  6. HandleScope handle_scope;
  7. Handle<Context> context;
  8.  
  9. Local<FunctionTemplate> t = FunctionTemplate::New();
  10. t->Set("a",Number::New(10));
  11. Local<Template> proto = t->PrototypeTemplate();
  12. Local<FunctionTemplate> ob = FunctionTemplate::New();
  13. proto->Set("c",Number::New(10));
  14. proto->Set("newObject",ob);
  15. global = t->InstanceTemplate();
  16.  
  17. context= Context::New(NULL,global);
  18. Context::Scope context_scope(context);
  19. Handle<v8::String> source = ReadFile("functionTemplate.js");
  20. Handle<Script> script = Script::Compile(source);
  21. Handle<Value> result = script->Run();
  22. String::Utf8Value str(result);
  23. script = Script::Compile(String::New("result"));
  24. result = script->Run();
  25. cout << *String::Utf8Value(result);
  26. return 0;
  27. }
javascript 語法 , 將 ObjectTemplate 的所有屬性值印出。
Example
  1. var s="";
  2. for(pro in __proto__){
  3. s+=pro+" ";
  4. }
  5.  
  6. var result = s;
  7. /*
  8. 執行結果
  9. c newObject
  10. */

回應 (Leave a comment)