Моя нативная функция должна возвращать объект, но возвращает вызываемый объект функции. Я использую spidermonkey jsapi для расширения моего приложения. Я определяю несколько классов, которые являются прокси-серверами своих C++-аналогов. Использование похоже на основной объект, называемый «mx», используемый для создания объектов типа «виджет» с использованием функции с именем «widget».Spidermonkey api: функция объекта, возвращающая объект
Каждый объект приложения имеет идентификатор какого-либо типа, который может быть передан конструктору объекта js как Аргумент. В SpiderMonkey 1.8.5 я мог бы создать объект JS виджет с помощью метода тх WIDGET
function on_trigger(triggervalue)
{
w = mx.widget("somename");
print_console("mx is " + mx);
print_console("w is " + w);
}
Но mx.widget («SomeName») не возвращает объект типа виджета, он возвращает объект функции:
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()
возвращения функции объекта, а не только что созданный объект?
Все лучшее Хайнер