虽不能至,心向往之

—— 巴人也,操C++口音,混迹于京师,勉强度日……《史记·corelito列传》
posts - 8, comments - 15, trackbacks - 0, articles - 0

使用V8——Google Chrome 的 JavaScript 引擎(3)

Posted on 2008-10-19 23:35 sufan 阅读(2970) 评论(1)  编辑 收藏 引用 所属分类: 翻译
访问器——访问脚本中的变量
我们已经能够在脚本中使用函数了。但如果我们能够使用在脚本中定义的变量什么的岂不是更好?说做就做!V8有一个叫做访问器的东西,有了它,我们就能通过名字来使用变量以及与它相关的两个Set/Get函数,在运行脚本程序的时候,V8就是通过这两个函数来实现对变量的访问。

global->SetAccessor(v8::String::New("x"), XGetter, XSetter);

这行代码就将“x”与“XGetter”和“XSetter”函数联系在一起了。当V8需要得到“x”变量的值的时候,它就会去调用“XGetter”函数,相类似的,如果V8要更新“x”变量的值的时候,它调用的是“XSetter”函数。现在,我们的代码成了:

//the x variable!
int x;

//
get the value of x variable inside javascript
static v8::Handle<v8::Value> XGetter( v8::Local<v8::String> name, 
                  
const v8::AccessorInfo& info) {
  
return  v8::Number::New(x);
}

//
set the value of x variable inside javascript
static void XSetter( v8::Local<v8::String> name, 
       v8::Local
<v8::Value> value, const v8::AccessorInfo& info) {
  x 
= value->Int32Value();
}

在 XGetter 函数中,我们所要做的只是将“x”转换成V8所能管理的 Number 类型的值。而在 XSetter 函数中,我们需要将这个作为参数传过来的值转换成一个整数。就像对应其基类型的函数,例如 NumberValue 之于 double,BooleanValue 之于 bool,等等。

对于 char * 类型的字符串,我们同样有:

//the username accessible on c++ and inside the script
char username[1024];

//
get the value of username variable inside javascript
v8::Handle<v8::Value> userGetter(v8::Local<v8::String> name, 
           
const v8::AccessorInfo& info) {
    
return v8::String::New((char*)&username,strlen((char*)&username));
}

//
set the value of username variable inside javascript
void userSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value,
    
const v8::AccessorInfo& info) {
    v8::Local
<v8::String> s = value->ToString();
    s
->WriteAscii((char*)&username);
}

 

对于字符串,情况就有一点小小的变化了。userGetter 以 XGetter 相类似的方式创建了一个新字符串,但是 userSetter 首先需要使用 ToString 函数来访问内部字符串缓冲区。然后,我们通过得到的指向内部字符串对象的指针,使用 WriteAscii 函数将字符串的内容写到我们的缓冲区。最后添加相对应的访问器,一切搞定!

//create accessor for string username
global->SetAccessor(v8::String::New("user"),userGetter,userSetter);

Feedback

# re: 使用V8——Google Chrome 的 JavaScript 引擎(3)  回复  更多评论   

2011-07-07 13:19 by 有趣之极
很好,学习

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理