在 C 程序中定义 JavaScript 对象
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
在 SpiderMonkey 中,在 JavaScript 中使用由 C 语言定义的对象较为复杂,一旦我们可 以定义对象,使得两个世界通过 JS 交互就变得非常简单而有趣,很容易使用这样的方式来 定制我们的应用,在系统发布之后仍然可以轻松的修改系统的行为。
首先,我们要定义好基本的数据结构,即我们要暴露给 JS 世界的对象的属性,结构; 然后,使用 JSAPI 定义这个对象的属性; 然后,使用 JSAPI 定义对象的方法; 最后,创佳这个对象,并绑定其属性表和方法列表,放入全局对象。
假设我们有这样一个数据结构,用来表述一个人的简单信息:
typedef struct{
char name[32];
char addr[128];
}PersonInfo;
定义属性表为枚举类型:
enum person{ NAME,
ADDRESS
};
我们需要将 C 语言原生的数据结构定义为 JSAPI 所识别的那样:
//define person properties
JSPropertySpec pprops[] = {
{"name", NAME, JSPROP_ENUMERATE},
{"address", ADDRESS, JSPROP_ENUMERATE},
{0}
};
//define person methods
JSFunctionSpec pfuncs[] = {
{"print", printing, 0},
{"getName", getName, 0},
{"setName", setName, 0},
{"getAddress", getAddress, 0},
{"setAddress", setAddress, 0},
{0}
};
//define person class (JSClass)
JSClass pclass = {
"person", 0,
JS_PropertyStub,
JS_PropertyStub,
JS_PropertyStub,
JS_PropertyStub,
JS_EnumerateStub,
JS_ResolveStub,
JS_ConvertStub,
JS_FinalizeStub
};
一旦这些基本信息定义好(pfuncs 数组中的 getter/setter 的实现比较简单,这里由于篇幅 不列出代码,感兴趣的朋友可以参看附录),我们就可以实例化它,并将其放入上下文中,使得 JS 代码可以访问。
JSObject *person;
//define the object
person = JS_DefineObject(\
context, global, "person", &pclass, 0, JSPROP_ENUMERATE);
//install the properties and methods on the person object
JS_DefineProperties(context, person, pprops);
JS_DefineFunctions(context, person, pfuncs);
这样,在 JavaScript 代码中,我们就可以通过 person 这个标识符来访问 person 这个对象了:
//undefined of course
person.print();
//person.name = "abruzzi";
//person.address = "Huang Quan Road";
person.setName("Desmond");
person.setAddress("HuangQuan Road");
//print is global function, access properties directly
print("person name = " + person.name);
print("person address = " + person.address);
person.print();
(function(){
//using getter/setter to access properties
return person.getName() + " : " + person.getAddress();
})();
对运行结果如下:
name : undefined
address : undefined
person name = Desmond
person address = HuangQuan Road
name : Desmond
address : HuangQuan Road
eval script result is : Desmond : HuangQuan Road
在线练习
{$ activeFileHint $}