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);