当前位置: 首页 > 知识库问答 >
问题:

将对象的成员函数公开为全局函数

卢涵畅
2023-03-14

例如,我有:

var n = {
  abc: function() { print("abc"); },
  def: function() { print("def"); },
};

有没有办法将abcdef导出为全局函数,这样我就可以直接调用abc(),而不是n.abc()

我的上下文是使用Rhino/Nashorn脚本引擎,我想注入一个提供全局函数的“全局”对象。

共有2个答案

裴意
2023-03-14

为什么不直接使用JavaScript的bindcall应用方法来调用对象的成员函数呢?使它们全局表示代码气味。

乜昆
2023-03-14

Rhino和Nashorn的答案会有所不同。

对于Rhino,当您使用上下文创建全局对象时。initStandardObjects,然后可以通过调用ScriptableObject在Java端添加属性。定义属性(参见Rhino API),然后属性将被添加到该全局范围。如果您需要一个function类型的属性(如示例所示),请使用FunctionObject API创建它。

对于Nashorn,您可以使用主要基于标准javax的接口。脚本API,带有几个特定于Nashorn的扩展。评估脚本时,首先使用ScriptEngine。createBindings()创建绑定对象,然后使用绑定。使用eval(字符串/读取器、绑定)

如果您需要一个函数属性,那么在Java调用ScriptUtils.wrap创建一个ScriptObjectMirror(确保将其转换为该属性;方法的返回类型是Object),然后调用get([函数名])获取一个可执行函数属性,然后将其放入全局作用域。

综上所述,在我看来,这在脚本方面更容易处理,使用:

var abc = function() { return n.abc.apply(n,arguments); };

这可以跨犀牛/纳肖恩移植,而且是一行,如果你想避免写那一行,这比你要做的工作要少得多。

如果在全局范围内执行,则不需要限定符;它将作为属性添加到顶级对象中。如果你想更明确,你可以这样做:

(function() {
    var global = this; // inner functions called without target default to global as 'this'
    this.abc = function() { return n.abc.apply(n,arguments); };
})();

...除非你开始做一些更有趣的事情(比如加载脚本时乱动“this”值),否则这是可行的。

 类似资料:
  • 如果你需要让一个工具函数在每个组件可用,可以把方法挂载到 Vue.prototype上。 注册 main.js 中 Vue.prototype.$method = function () {} 一般建议函数名使用 $ 前缀。像 vue-router 的 $route 和 $router。 使用 那么组件代码里 export default { created () { this.$m

  • 问题内容: 因此,我正在重构代码以实现更多的OOP。我设置了一个类来保存页面属性。 稍后,我像这样调用set_page_title()函数 当我收到错误消息时: 调用非对象上的成员函数set_page_title() 那我想念什么呢? 问题答案: 这意味着它不是对象的实例。我们可以看到您用来初始化变量的代码吗? 当您期望特定的对象类型时,还可以使用PHP的类型提示功能 Docs 在违反逻辑时得到错

  • 问题内容: 我正在尝试使用Luaj + Java构建控制器。我有以下java类 以及控制器的以下lua脚本: 理想情况下,我想定义一个控制器(用lua编写),在其中我将保留程序的所有逻辑,并且我希望将该控制器的API公开给我的Java代码。我正在尝试使用以下方法: 我无法将对象传递给LuaValue。如何将Java对象传递给lua脚本? PS:通常,在使用Java和嵌入式脚本时,人们会将功能捆绑在

  • 全局函数 返回上级 DirectDrawCreate DirectDrawCreateClipper DirectDrawEnumerate DirectDrawEnumerateEx DirectDrawCreate 返回目录 创建一个DirectDraw对象的实例。 HRESULT WINAPI DirectDrawCreate( GUID FAR *lpGUID, LPDIRECTDRAW

  • debug 调试打印PHP变量,并中断执行。等同于 var_dump($var1, $var2);die; table 将任意MySQL表构造成Model对象。 table($table_name, $db_object_id); model 创建模型对象。 model($model_name, $db_object_id);

  • Herosphp提供了一些全局辅助函数: //格式化打印变量(数据) __print($message); //终端高亮打印绿色(success) tprintOk($message); //终端高亮打印红色(error) tprintError($message); //终端高亮打印黄色(warning) tprintWarning($message); //计算字符串的hash值, 默