Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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 如何在Rhino中创建本机函数?_Javascript_Rhino_Ringojs - Fatal编程技术网

Javascript 如何在Rhino中创建本机函数?

Javascript 如何在Rhino中创建本机函数?,javascript,rhino,ringojs,Javascript,Rhino,Ringojs,我一直在研究Rhino,寻找如何实现我自己的全局原生功能的线索。然而,这项任务比我预期的要复杂得多 在阅读了RingoJS中require函数的实现后,我认为我需要按照以下思路做一些事情: import org.mozilla.javascript.BaseFunction; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.Context; public class MyGlobalNativeFu

我一直在研究Rhino,寻找如何实现我自己的全局原生功能的线索。然而,这项任务比我预期的要复杂得多

在阅读了RingoJS中
require
函数的实现后,我认为我需要按照以下思路做一些事情:

import org.mozilla.javascript.BaseFunction;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.Context;

public class MyGlobalNativeFunction extends BaseFunction {
    public MyGlobalNativeFunction() {}

    public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
        // implementation of my function
    }

    public int getArity() {
        return 1;
    }
}
我在正确的轨道上吗?关于如何实现这一点的逐步演练将是非常棒的


如果我能使用Rhino的
defineClass
函数来创建我的全局本机函数,那也太好了。我不太热衷于推出我自己的Rhino修改版,因为我想实现一个本地函数。

我认为这应该可行,如果你只想实现一个全局函数,这是一个很好的方法。如果要实现多个函数或一个宿主对象,还有其他方法

然后,您可以使用类似这样的方法来实例化您的函数:

scope.defineProperty("myNativeFunction",
                     new MyGlobalNativeFunction(),
                     ScriptableObject.DONTENUM);

查看这是如何完成的(它还显示了如何在一次扫描中定义多个函数,而不必为每个函数创建一个类)。包含一些如何使用Rhino创建适当的主机对象的示例。

首先,您需要初始化全局范围(初始化所有javascript标准对象、函数等),然后按照Hannes Wallnöfer所写将函数添加到此范围

Context cx = Context.enter();  //enter rhino context - bind context with current thread
Scriptable globalScope= cx.initStandardObjects();  //init js standard object in global scope
globalScope.defineProperty("myNativeFunction",
                     new MyGlobalNativeFunction(),
                     ScriptableObject.DONTENUM);
就这样

现在调用此函数调用:

Object result = cx.evaluateString(globalScope, "myNativeFunction()", "<cmd>", 1, null);
Object result=cx.evaluateString(globalScope,“myNativeFunction()”,“”,1,null);

有关更多信息,请参见:

我假设
scope
是全局范围,对吗?我在哪里实例化它,以及如何访问
范围
?我看到
RingoGlobal
有一个名为
init
的方法。