Spidermonkey api: 对象函数返回一个对象
Spidermonkey api: object function returning an object
我的本机函数应该 return 一个对象,但它 return 是被调用的函数对象。我正在使用 spidermonkey jsapi 来扩展我的应用程序。我定义了几个 类 ,它们是它们的 c++ 对应物的代理。用法就像一个名为 'mx' 的主对象,用于使用名为 'widget'
的函数创建类型为 'widget' 的对象
每个应用程序对象都有某种 ID,可以将其作为参数传递给 js 对象构造函数。在 spidermonkey 1.8.5 中,我可以使用 mx 小部件方法创建一个 js 小部件对象
function on_trigger( triggervalue )
{
w = mx.widget("somename");
print_console("mx is " + mx );
print_console("w is " + w );
}
但是 mx.widget("somename") 不是 return 类型小部件的对象,它 return 是函数对象:
mx is [object mx]
w is function widget() {
[native code]
}
jsapi 类 和函数是这样实现的:
JSBool mx_wrapper_getwidget(JSContext* cx, unsigned argc, jsval* argv)
{
JSObject *global = JS_GetGlobalForScopeChain(cx);
jsval v;
JS_GetProperty(cx, global, widget_wrapper_class.name, &v);
JS::CallArgs args = JS::CallArgsFromVp(argc, argv);
JSObject *w = JS_New(cx, JSVAL_TO_OBJECT(v), argc, args.array());
args.rval().setObject( *w );
return JS_TRUE;
}
static JSFunctionSpec mx_wrapper_methods[] =
{
JS_FS("widget", mx_wrapper_getwidget, 1, 0),
JS_FS_END
};
JS_InitClass(cx, global, NULL, &mx_wrapper_class, mx_wrapper_cons, 0, mx_wrapper_properties, mx_wrapper_methods, NULL, NULL)
JS_DefineObject(cx, global, "mx", &mx_wrapper_class, mx_wrapper_proto, 0);
为什么 JSBool mx_wrapper_getwidget()
return 函数对象而不是新创建的对象?
祝一切顺利
海纳
自己回答:除其他各种小问题外,我没有正确定义我的 class
错误(widget_wrapper_finalize,JSCLASS_NO_OPTIONAL_MEMBERS缺失):
static JSClass widget_wrapper_class =
{
MX_JS_WIDGET_CLASSNAME, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, NULL
};
对:
static JSClass widget_wrapper_class =
{
MX_JS_WIDGET_CLASSNAME, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, widget_wrapper_finalize, JSCLASS_NO_OPTIONAL_MEMBERS
};
我的本机函数应该 return 一个对象,但它 return 是被调用的函数对象。我正在使用 spidermonkey jsapi 来扩展我的应用程序。我定义了几个 类 ,它们是它们的 c++ 对应物的代理。用法就像一个名为 'mx' 的主对象,用于使用名为 'widget'
的函数创建类型为 'widget' 的对象每个应用程序对象都有某种 ID,可以将其作为参数传递给 js 对象构造函数。在 spidermonkey 1.8.5 中,我可以使用 mx 小部件方法创建一个 js 小部件对象
function on_trigger( triggervalue )
{
w = mx.widget("somename");
print_console("mx is " + mx );
print_console("w is " + w );
}
但是 mx.widget("somename") 不是 return 类型小部件的对象,它 return 是函数对象:
mx is [object mx]
w is function widget() {
[native code]
}
jsapi 类 和函数是这样实现的:
JSBool mx_wrapper_getwidget(JSContext* cx, unsigned argc, jsval* argv)
{
JSObject *global = JS_GetGlobalForScopeChain(cx);
jsval v;
JS_GetProperty(cx, global, widget_wrapper_class.name, &v);
JS::CallArgs args = JS::CallArgsFromVp(argc, argv);
JSObject *w = JS_New(cx, JSVAL_TO_OBJECT(v), argc, args.array());
args.rval().setObject( *w );
return JS_TRUE;
}
static JSFunctionSpec mx_wrapper_methods[] =
{
JS_FS("widget", mx_wrapper_getwidget, 1, 0),
JS_FS_END
};
JS_InitClass(cx, global, NULL, &mx_wrapper_class, mx_wrapper_cons, 0, mx_wrapper_properties, mx_wrapper_methods, NULL, NULL)
JS_DefineObject(cx, global, "mx", &mx_wrapper_class, mx_wrapper_proto, 0);
为什么 JSBool mx_wrapper_getwidget()
return 函数对象而不是新创建的对象?
祝一切顺利 海纳
自己回答:除其他各种小问题外,我没有正确定义我的 class
错误(widget_wrapper_finalize,JSCLASS_NO_OPTIONAL_MEMBERS缺失):
static JSClass widget_wrapper_class =
{
MX_JS_WIDGET_CLASSNAME, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, NULL
};
对:
static JSClass widget_wrapper_class =
{
MX_JS_WIDGET_CLASSNAME, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, widget_wrapper_finalize, JSCLASS_NO_OPTIONAL_MEMBERS
};