Javascript 如何在Rhino中创建本机函数?
我一直在研究Rhino,寻找如何实现我自己的全局原生功能的线索。然而,这项任务比我预期的要复杂得多 在阅读了RingoJS中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
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
的方法。