javascript - 是否有一种技术可以“覆盖”Javascript 中的函数?
问题描述
我表面上理解函数是如何在 javascript 中被覆盖的......最后一个加载的方法(具有相同的名称 - 没有签名)被执行。
我的网页插件作为 js 脚本分发。作为其功能的一部分,第三方脚本在加载时会调用方法“x()”。我的插件的消费者可能已经在他们的网页上有一个 x() 方法来(以他们自己的方式)与该第三方脚本进行交互。如果他们不这样做,我想执行我的。问题是我的 x() 覆盖了他们的,这不是想要的行为。
就我个人而言,我认为使用 'last one rules' 覆盖函数有点疯狂,因为网络延迟。猜猜,那是另一个故事了。
幸运的是,我可以查找特定的 div,并且知道客户端将拥有自己的 x() 方法,并且有条件地将我的方法添加为单独的脚本。这样我的方法只有在他们没有的时候才会出现在页面上。
有没有更优雅的方式来做到这一点?实际上,我想要一个 x() 来取代客户的 x()。我担心在某些时候我将无法轻松检查他们的 x()。顺便说一句...检查 x() 的存在,typeof === 'function'
只为我的 x() 返回 true。
解决方案
全局命名空间污染是一件可怕的事情。它正在破坏家庭并摧毁我们的城市。但是,在这种情况下,您可以缓解该问题:
let existingX = window.x || undefined;
function x(whatever) {
if (existingX && typeof existingX == 'function') {
existingX(whatever);
}
else {
// all of your version of x
}
}
如果您愿意,可以使用比“existingX”更晦涩的名称来避免再次发生冲突。
另一种选择可能是:
var x = window.x && typeof window.x == 'function' ? window.x : function(whatever) {
// your code
};
当然,如果现有x
的不是打算覆盖您的功能的功能,那么除了可能console.log()
发出严厉警告之外,您无能为力。
推荐阅读
- angularjs - 为什么我的 AngularJS 模板加载器适用于 1.6.1 版本,但不适用于 1.7(或 1.8)?
- python - SQLAlchemy:创建由另一个复合主键组成的复合主键
- c - 在 Eclipse 中编译 C 代码时出现 E219 错误
- internet-explorer - 无法通过 Internet Explorer 删除 SharePoint 上的项目
- javascript - 事件发生后如何执行 rxjs 请求?
- java - Android 应用程序在实现 android.support.design.widget.BottomNavigationView 时不断崩溃
- python - 如何在 Python 中正确序列化和反序列化 paging_size?
- google-sheets - 是否可以将此谷歌表格中的单元格 L2 转换为数组公式?
- python - 如何对字典列表进行分组
- c# - ARTrackedImage 仅在第一次切换