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

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(使用前将#替换为@)

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

  • TinyMCE 图像上传 API 不显示图像选择器图标

    我们按照本教程中的说明进行操作 但由于某种原因 图像对话框上的上传按钮 图像 URL 旁边的搜索文件夹图标 未显示 http www tinymce com wiki php Handling Asynchronous Image Uplo
  • 为什么“true && () => {}”会产生“Uncaught SyntaxError:格式错误的箭头函数参数列表”? [复制]

    这个问题在这里已经有答案了 下面的代码 执行时 true gt yields Uncaught SyntaxError Malformed arrow function parameter list Why 编辑 我知道将函数包装在括号中是
  • 在 Cypress 中提取部分文本

    我是 Cypress 的新手 我需要从我的应用程序中提取文本的动态部分 div Hello World greeting number 9123 div 在此示例中 我需要从 div 中提取 9123 以便稍后在测试中使用 知道我应该怎么做
  • react-dom/server 可以在客户端工作吗?

    我需要在客户端呈现顶级 html 标签 例如 结果将被注入到 iframe 中 在服务器上 我会使用renderToStaticMarkup函数来自react dom server 但仅限客户端react dom没有这个功能 Will re
  • 在移动浏览器或 PhoneGap 应用程序之间进行检测

    是否可以使用 JavaScript 检测用户是否通过浏览器或应用程序进行访问 我正在通过网页和 PhoneGap 应用程序开发适用于多个移动操作系统的混合应用程序 目标是 独立于部署目标使用相同的代码 仅当用户代理是应用程序时添加 Phon
  • 查找数组中多个最大值的索引

    我有一个示例数组 var arr 10 67 100 100 我想找到数组中最大值的索引 该函数仅查找一个索引 function max arr var max arr 0 var maxIndex 0 for var i 1 i lt a
  • 获取语​​音通道的用户数

    我正在重写我的音乐部分朋友不和谐机器人 https top gg bot 629799045954797609 我试图弄清楚如何获取执行命令的人的语音通道中的用户数量 我到处都找过 但似乎找不到它或它的用法 现在我正在使用以下内容 modu
  • 如何使用 Javascript 将 HTML 表单数据输出到 XML 文件?

    我目前正在尝试弄清楚如何将 HTML 表单数据输出到 XML 文件 这是我过去几天一直在研究的一个想法 目的是创建一个用于 Windows 7 安装的 autounattended xml 文件 目前我的 HTML 如下
  • 按住鼠标时 JavaScript 重复动作

    是否有一个 JavaScript 函数每隔如此多的毫秒重复一次 以至于按住 html 按钮 如果这可以使用标准 JavaScript 来完成 那就太好了 但使用 jQuery 或 jQuery 插件也很棒 On the mousedown
  • 在 Cytoscape.js 中为家谱设置边缘样式

    我有一个使用 Django 的家谱应用程序 我正在尝试使用http js cytoscape org http js cytoscape org对于用户界面 我想设置之间的边缘样式浪漫的伴侣像这样 http www eprintableca
  • 添加数组的总和。显示1个输出

    更新 这个问题的答案如下 感谢在不同线程上进行的 dougtesting 将数组相加 显示总和 https stackoverflow com questions 45724641 add array together display su
  • 获取 Firebase AngularFire 中项目的索引 ID

    这里提出了类似的问题 但接受的答案并没有真正回答这个问题 使用 AngularFire 是否可以创建关系型数据库 或者访问 UniqueID https stackoverflow com questions 16879484 using
  • 在 forEach() 中使用 `this` [重复]

    这个问题在这里已经有答案了 免责声明 我正在学习 JavaScript 我有一个像这样的对象构造函数 var Palette function this colors red green blue this getColorCombinat
  • 如何按日期升序对对象进行排序?

    如果我有一个对象列表 var objectList LIST OF OBJECT each object列表中包含三个属性 name date gender 如何按 对列表中的对象进行排序date 属性升序 the date 属性包含字符串
  • 如何查明在 Chrome 控制台中按下按钮时会调用哪些函数?

    我正在尝试自学 Google Closure javascript 库 我正在检查 TreeControl UI 小部件 如何使用Chrome控制台分析当我点击下面演示中的 剪切 按钮时运行了哪些功能 例如 我可以为此设置一个断点吗 我尝试
  • PHP:在执行 php 脚本时显示“正在加载”页面

    这就是我现在所拥有的 我有一个网页 当访问该网页时 它会通过开放 API 连接到 Surveygizmo com 检索大量数据 然后将这些数据返回给我进行处理 此过程大约需要 10 12 秒 在执行时 页面只是处于 正在加载 状态 并且我会
  • 使用 System.js 导入 Typescript 编译的模块时出错

    我最近正在学习使用 system js 导入由 Typescript 编译的模块 这些模块之前是为 require js 编译的 并且工作正常 但是合并到system js时 应用时无法导入模块系统生产 js 控制台说 Uncaught i
  • 如何实现 chromecast 对 html5 播放器的支持

    我使用js和html5设计了一个具有一些自定义功能的html5播放器 现在我需要在html5播放器上添加chromecast选项 例如https raw githubusercontent com kim company videojs c
  • 如何控制谷歌地图标记的不透明度

    我需要根据时间使一些标记半透明 有什么方法可以控制标记的 CSS 不透明度吗 或者是否可以可靠地找出标记的 DOM 元素 我使用 Google 地图 API v3 标记的不透明度可以设置为marker setOptions opacity
  • ExtJS:简单表单忽略 formBind

    我有一个小问题让我发疯了好几天 我有一个表单面板 Ext define EC view PasswordPanel extend Ext form Panel alias widget pwdpanel bodyPadding 15 ini

随机推荐

  • 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 但尽管我设法做到了 但它并没有改变我的应用程序的工作方式 顺便说一句 即使它有效 我是否应该每次都显式调用