Ошибка типа Spidermonkey

Мне удалось интегрировать Spidermonkey в мое приложение на стороне сервера C в Linux. Пытаюсь создать объект из javascript:

var obj = new MyObject();
obj.foo()

дает следующую ошибку:

[ошибка] test.js:22:TypeError: obj.foo не является функцией

Я, наверное, что-то упустил... Вот как определил MyObject:

//Class definition
static JSClass myobject_class = {
    "MyObject", JSCLASS_HAS_PRIVATE,
        JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
        JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
        JSCLASS_NO_OPTIONAL_MEMBERS
};


//Methods
static JSFunctionSpec myobject_funcs[] = {
    JS_FS("foo", JS_foo, 0, 0),
};


//Static methods
static JSFunctionSpec myobject_funcs_static[] = {
    JS_FS_END
};



//foo method
JSBool JS_foo(JSContext *cx, uintN argc, jsval *vpn) {

    return JS_TRUE;
}


//Constructor
JSBool JS_myobject_ctor(JSContext *cx, uintN argc, jsval *vpn) {

    JSObject *obj = JS_NewObjectForConstructor(cx, vpn);
    JS_DefineFunctions(cx,obj,myobject_funcs);


    return JS_TRUE;

}

//Init context
JSContext *  context_init(size_t size,void* privateData) {
    /* Create a context. */
    jsContext = JS_NewContext(jsRuntime, 8192);
    if (jsContext == NULL) return NULL;
    .....
    .....
    .....  
    //myobject init
    JSObject *my = JS_InitClass(jsContext, global, NULL, &myobject_class, JS_myobject_ctor, 0, NULL, NULL, NULL, myobject_funcs_static);
    JS_DefineFunctions(jsContext, my, myobject_funcs);

    return jsContext;

}

person Mefa Grut    schedule 27.02.2012    source источник
comment
obj instanceof MyObject возвращает false.   -  person Mefa Grut    schedule 27.02.2012


Ответы (1)


Мне удалось найти более старый пример, который включал:

JS_SET_RVAL(cx, vpn, OBJECT_TO_JSVAL(obj));

в конструкторе.

Это сработало как заклинание.

//Constructor
JSBool JS_myobject_ctor(JSContext *cx, uintN argc, jsval *vpn) {

    JSObject *obj = JS_NewObjectForConstructor(cx, vpn);
    JS_DefineFunctions(cx,obj,myobject_funcs);


    JS_SET_RVAL(cx, vpn, OBJECT_TO_JSVAL(obj));

    return JS_TRUE;

}
person Mefa Grut    schedule 05.03.2012
comment
Ты получил это. Обратите внимание, что, как обычно в коде C, вы должны проверять наличие ошибок. Например, после первой строки здесь вы должны if (obj == NULL) return JS_FALSE;. И если JS_DefineFunctions возвращает false, вы должны обнаружить это и вернуть JS_FALSE. - person Jason Orendorff; 25.04.2012