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

时间:2012-10-23 14:43:51

标签: javascript rhino ringojs

我一直在关注Rhino documentationsource code,了解如何实现我自己的全局本机函数。然而,这项任务比我预期的要复杂得多。

在阅读了RingoJS中require函数实现的code后,我相信我需要按照以下几点做一些事情:

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修改版本,因为我想实现一个原生函数。

2 个答案:

答案 0 :(得分:4)

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

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

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

查看RingoGlobal如何完成此操作(它还显示了如何在一次扫描中定义多个函数,而无需为每个函数创建一个类)。 Rhino examples directory包含一些如何使用Rhino创建正确的宿主对象的示例。

答案 1 :(得分:4)

首先,您需要初始化全局范围(初始化所有javascript标准对象,函数等),然后将您的函数添加到此范围,如HannesWallnö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 embedding tutorial