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)