Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么是JSRawObject?如何从JSObject*获取它?_Javascript_Spidermonkey - Fatal编程技术网

Javascript 什么是JSRawObject?如何从JSObject*获取它?

Javascript 什么是JSRawObject?如何从JSObject*获取它?,javascript,spidermonkey,Javascript,Spidermonkey,我正在嵌入SpiderMonkey并尝试使用JS\u BindCallable。但是,我有一个JSObject*,我想用它作为newThis,但是函数采用了JSRawObject。关于JSRawObject的文档似乎很少,头文件也没有提供任何线索 如果我只是简单地向它传递一个JSObject*,而没有崩溃,它似乎可以编译,但我不知道为什么,这让我感到不舒服。此外,它似乎不起作用——不确定这是因为这个问题还是其他原因。特别是,我正在这样做: JSObject *result = JS_NewObj

我正在嵌入SpiderMonkey并尝试使用
JS\u BindCallable
。但是,我有一个
JSObject*
,我想用它作为
newThis
,但是函数采用了
JSRawObject
。关于
JSRawObject
的文档似乎很少,头文件也没有提供任何线索

如果我只是简单地向它传递一个
JSObject*
,而没有崩溃,它似乎可以编译,但我不知道为什么,这让我感到不舒服。此外,它似乎不起作用——不确定这是因为这个问题还是其他原因。特别是,我正在这样做:

JSObject *result = JS_NewObject(cx, NULL, NULL, NULL);

//create .finish() callable
int props = JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_ENUMERATE;
JS_DefineFunction(cx, result, "finish", my_native_func, 0, props);

//bind finish to always use 'this'
jsval jsvFinishFuncObj;
JS_GetProperty(cx, result, "finish", &jsvFinishFuncObj);
JSObject *finishFuncObj = JSVAL_TO_OBJECT(jsvFinishFuncObj);
JS_BindCallable(cx, finishFuncObj, result);

JSRawObject
JSObject*
的类型定义,因此您的用法是正确的。我们这样做了,因为在未来的版本中,所有API都将使用句柄,就像JS::HandleObject一样。您可以在此处了解即将发生的变化:

我认为您必须使用返回值
JS_BindCallable
并用它覆盖“finish”。实际上,您可能会这样做:

//define a function on an object which is bound to the object it is defined on
JSBool JS_DefineBoundFunction(JSContext *cx, JSObject *obj, const char *name,
                              JSNative call, unsigned int nargs, unsigned int attrs) {
    JSFunction *func = JS_NewFunction(cx, call, nargs, 0, NULL, name);
    if (!func) {
        return JS_FALSE;
    }
    JSObject *funcObj = JS_GetFunctionObject(func);
    if (!funcObj) {
        return JS_FALSE;
    }
    JSObject *boundFuncObj = JS_BindCallable(cx, funcObj, obj);
    if (!boundFuncObj) {
        return JS_FALSE;
    }
    return JS_DefineProperty(cx, obj, name,
                             OBJECT_TO_JSVAL(boundFuncObj),
                             NULL, NULL, attrs);
}

啊,这很有道理,谢谢。。。现在,我如何从
JSFunction*
转换为
JSObject*
?刚刚转换的JSFunction是JSObject的一个子类:噢,明白了。我使用了
JS_GetFunctionObject
,它似乎刚刚抛出了它。我做了一个有用的助手函数,我会编辑你的测试代码并接受答案。