是否可以覆盖“呼叫”功能?

2023-11-26

是否可以在通用级别上重写“调用”函数,以便每次在应用程序中的任何位置调用方法时都会发生一些情况。

我尝试覆盖 Object.call,但尽管我设法做到了,但它并没有改变我的应用程序的工作方式。

顺便说一句,即使它有效,我是否应该每次都显式调用“foo.call(this,args)”,或者正常的函数调用也将起作用“foo(args)”?


听起来你想在这里进行某种面向方面的编程......

JavaScript 作为 ECMAScript 方言,确实有一个概念可调用对象。每个可调用对象都有一个内部财产 called [[Call]]。 ECMA-262 规范第 5 版第 8.6.2 节、表 9 中描述了此属性。它说:

执行与对象关联的代码。通过函数调用表达式调用。 SpecOp 的参数是一个 this 对象和一个包含传递给函数调用表达式的参数的列表。实现此内部方法的对象是可调用的。只有作为宿主对象的可调用对象才可以返回引用值。

但需要注意的是[[Call]]是一个内部属性,规范对此表示:

内部属性没有名称,并且不能通过 ECMAScript 语言运算符直接访问。内部属性的存在纯粹是为了规范目的。

因此,您无法在自己的 JavaScript 代码中挂钩此机制。

现在那里are中定义的两个方法Function.prototype, apply and call。确实,如果你改变定义Function.prototype.call那么如果你创建自己的函数f, then f.call确实会执行该代码(除非在 f 的原型或 f 本身中被重写)。正如您所料,这不会通过调用自动发生f直接地。您必须明确调用call method.

尽管如此,最好不要在内置对象的原型中使用预定义的标准方法。库和应用程序中的许多现有代码都依赖于Function.prototype.call。别乱搞它。当然,您可以通过多种方式实现一种 AOP 行为。一是添加到Function.prototype其他一些方法,但也不要这样做。另一种方法是使用 before 和 after 挂钩编写自己的调用方法:

function call(theThis, before, main, after, beforeArgs, mainArgs, afterArgs) {
    before.apply(theThis, beforeArgs);
    main.apply(theThis, mainArgs);
    after.apply(theThis. afterArgs);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以覆盖“呼叫”功能? 的相关文章

随机推荐

  • Google 应用程序引擎 Node.js TLS 1.2

    我们的应用程序托管在 Google App Engine Node js 灵活环境 上 我们目前正在接受安全检查 但未能解决 Google App Engine 支持 TLS 1 0 和 1 1 版本的问题 有没有办法强制只使用 TLS 1
  • 在react router中显示路由之间的简单加载指示器

    我来自AngularJS世界并在几天前开始编写我的第一个 React 应用程序react router in AngularJS I do app directive Loading function rootScope timeout r
  • 如何从字符串中获取浮点值

    我有一个像这样的字符串 gt 12 4N m kg 我需要从上面的字符串中获取一个值12 4 当我使用替换所有功能时str replaceAll 0 9 当字符串有两个点时 这不起作用 浮点值的位置可能不同 首先丢弃所有非浮点字符 然后转换
  • 由于@font-face,jQuery 计算出了错误的高度

    我对 jQuery 和 font face 有疑问 我需要计算出 a 的高度 div 效果很好 但是字体加载时会有一点延迟 一旦加载 font face 字体实际上就比后备字体大 因此高度比应有的要小 我尝试过使用 Modernizr 但这
  • 如何在 JavaConfig 中定义 http“security = 'none'?

    我想使用 Java Config 在 Spring Boot 中定义类似于此 XML 的内容
  • 水晶报告图像被压扁

    Crystal Reports v11 如果这很重要 中是否有任何方法可以防止图像自行拉伸以适合整个 OLE 对象 我正在从数据库动态加载图像 但不知道它们的长宽比 感谢帮助 我找到了答案here 要使图像正确调整大小 必须按顺序执行以下步
  • Elasticsearch 超时 true 但仍然得到结果

    我将搜索查询的超时设置为 10 毫秒 因此我预计 elasticsearch 搜索查询应在 10 毫秒内超时 在回应中 我确实得到了 timed out true但查询似乎没有超时 它仍然运行几百毫秒 响应示例 took 460 timed
  • 如何为每个请求执行通用代码?

    有没有可能找到类似的功能Page Load 我有 MVC 应用程序 我需要在每个页面加载或重新加载时运行一些代码 或者调用一些控制器 所有类都有一个共享函数 我尝试 Application Start 但这仅在应用程序第一次运行时执行 我搜
  • 线程阻止所有者的垃圾收集

    在我创建的库中 我有一个 DataPort 类 它实现与 NET SerialPort 类类似的功能 它与某些硬件进行通信 并且每当数据通过该硬件传入时就会引发一个事件 为了实现此行为 DataPort 启动一个线程 该线程预计具有与 Da
  • OpenCV 2.4.9 for Python,找不到棋盘(相机标定教程)

    我正在尝试根据以下内容使用 OpenCV 工具校准相机本指南 问题是这个函数findChessboardCorners在我尝试过的图像上找不到任何棋盘 我用了很多 甚至只是简单的棋盘图案 无论如何 什么也没有被发现 这是代码 几乎与上面的链
  • Windows下在adb中运行vi

    偶尔 我会想要编辑一个文件 比如我的 Android 设备上的 system build prop 或 etc hosts 我发现最简单的方法是 c gt adb shell su vi etc hosts 如果我使用 Linux 这工作得
  • 在模型类中使用 javafx.beans 属性

    在模型类中使用 JavaFX beans 属性是否正确 我想知道在模型类中使用属 性以便能够更轻松地将它们与视图组件绑定是否是一个好习惯 我并不担心这些库将来的可用性 因为我的程序将在 JRE8 或更高版本上运行 但在模型类中使用 Java
  • 将多个连续的连字符替换为一个

    这在 JavaScript 中可能吗 我从 Java 中得到了这个 但不能在 Javascript 中使用 s 2 g 还有其他有效的方法吗 是的 您可以在 Javascript 中使用相同的正则表达式replace method s re
  • 如何在 RockMongo 或 mViewer 上的 mongodb 客户端中运行聚合查询

    我刚刚开始使用 mongo db 我使用 rockmongo 客户端和我的 ubuntu 终端作为另一个客户端 我已经使用组聚合实现了查询 如下所示 db archiveImpl group key accountID true phone
  • 如何复制debug.keystore文件?

    我有同样的问题Android Google 地图在我的计算机之外无法运行 并且在解决方案中 看起来确保我团队中的每个人都拥有相同的 keystore 文件将解决问题 但是 keystore 文件是隐藏的 我想它也以某种方式加密 您不能仅使用
  • Tensorboard - 可视化 LSTM 的权重

    我使用多个 LSTM 层来形成深度循环神经网络 我想在训练期间监控每个 LSTM 层的权重 但是 我不知道如何将 LSTM 层权重的摘要附加到 TensorBoard 关于如何做到这一点有什么建议吗 代码如下 cells with tf n
  • Excel有地图或选择功能吗?

    我有一行字符串值 我想做一个vlookup对每个结果进行计算 然后计算结果的平均值 如果这是 C 我会做Select str gt VLookup str dict Average 有没有办法在单个 Excel 函数中做到这一点 我用的是2
  • 确定浏览器是否具有拖放功能?

    我正在实施jQuery 文件上传并试图找出检测客户端是否可以支持拖放的最佳方法 这样我就可以渲染诸如 将文件拖放到此处上传 之类的内容 只有当他们实际上可以做到这一点时 在插件代码中我可以看到一个函数isXHRUploadCapable这似
  • 从 requirejs 映射调用文本插件

    我正在使用 TypeScript Backbone 和 Mustache 编写一个 Web 应用程序 我想使用 Requirejs 进行依赖加载 我还使用 TypeScript 的 Web Essentials Visual Studio
  • 是否可以覆盖“呼叫”功能?

    是否可以在通用级别上重写 调用 函数 以便每次在应用程序中的任何位置调用方法时都会发生一些情况 我尝试覆盖 Object call 但尽管我设法做到了 但它并没有改变我的应用程序的工作方式 顺便说一句 即使它有效 我是否应该每次都显式调用