Spidermonkey api:返回对象的对象函数

时间:2015-06-12 09:04:08

标签: c++ spidermonkey

我的本​​机函数应返回一个对象,但它返回被调用的函数对象。我正在使用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”)不返回widget类型的对象,它返回函数对象:

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()返回函数对象而不是新创建的对象?

一切顺利 海纳

1 个答案:

答案 0 :(得分:0)

回答自己:在其他各种小问题中,我没有正确定义我的课程

错误( 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
};