首页 > 解决方案 > 是否有一种技术可以“覆盖”Javascript 中的函数?

问题描述

我表面上理解函数是如何在 javascript 中被覆盖的......最后一个加载的方法(具有相同的名称 - 没有签名)被执行。

我的网页插件作为 js 脚本分发。作为其功能的一部分,第三方脚本在加载时会调用方法“x()”。我的插件的消费者可能已经在他们的网页上有一个 x() 方法来(以他们自己的方式)与该第三方脚本进行交互。如果他们不这样做,我想执行我的。问题是我的 x() 覆盖了他们的,这不是想要的行为。

就我个人而言,我认为使用 'last one rules' 覆盖函数有点疯狂,因为网络延迟。猜猜,那是另一个故事了。

幸运的是,我可以查找特定的 div,并且知道客户端将拥有自己的 x() 方法,并且有条件地将我的方法添加为单独的脚本。这样我的方法只有在他们没有的时候才会出现在页面上。

有没有更优雅的方式来做到这一点?实际上,我想要一个 x() 来取代客户的 x()。我担心在某些时候我将无法轻松检查他们的 x()。顺便说一句...检查 x() 的存在,typeof === 'function'只为我的 x() 返回 true。

标签: javascriptjquery

解决方案


全局命名空间污染是一件可怕的事情。它正在破坏家庭并摧毁我们的城市。但是,在这种情况下,您可以缓解该问题:

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()发出严厉警告之外,您无能为力。


推荐阅读