4

我一直在查看 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,只是因为我想实现一个本机功能。

4

2 回答 2

4

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

然后你会使用这样的东西来实例化你的函数:

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

查看RingoGlobal了解这是如何完成的(它还展示了如何在一次扫描中定义多个函数,而无需为每个函数创建一个类)。Rhino 示例目录包含一些如何使用 Rhino 创建合适的宿主对象的示例。

于 2012-10-24T06:49:35.537 回答
4

首先,您需要初始化全局范围(初始化所有 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);

有关更多信息,请参阅:rhino 嵌入教程

于 2012-10-27T14:36:39.427 回答