覆盖外部脚本中定义的函数

时间:2016-06-19 00:57:50

标签: javascript

我正在尝试用JavaScript编写一些用户脚本以用于浏览器扩展。

在网站中,我尝试使用Object.defineProperty覆盖外部javascript中定义的函数。但似乎这打破了外部脚本,因为外部脚本中的其他代码(对原始网站至关重要)似乎也没有执行。

<html>
  <head>
    <!-- injected script, injected via Userscript -->
    <script> 
      Object.defineProperty(window, 'originalFunction', { get: function() { return overridingFunction; } });
    </script>
    <!-- injection end -->
  </head>
  <body>
    <script src="/external-javascript.js">
    <script> originalFunction(); </script>
    <script> anotherEssentialFunction(); </script>
  </body>
</html>

http://domain/external-javascript.js看起来像这样&#34;

...
function originalFunction() {
  some codes here;
}
...
function anotherEssentialFunction() {
  ....
}

这阻止了另一个EssentialFunction运行。在控制台中,我看到TypeError: can't redefine non-configurable property originalFunctionReferenceError: anotherEssentialFunction is not defined 在这种情况下是预期的,还是应该有其他问题造成这里没有描述?如何在不导致此类错误的情况下安全地覆盖原始功能?

1 个答案:

答案 0 :(得分:1)

Object.defineProperty将函数的名称作为参数,因此您必须这样做:

Object.defineProperty(window, 'originalFunction', { 
  get: function() { 
    return overridingFunction; 
  } 
});

或者,如果那是吸气剂的全部,那么,只需:

window.originalFunction = overridingFunction;

但是如果其他函数需要调用原始函数,那么在不破坏依赖于其行为的函数的情况下,您无法真正覆盖它。如果您只是尝试执行原始代码之外的自定义代码,则可以执行以下操作:

var origFn = window.originalFunction;
window.originalFunction = function () {
  customFunction();
  origFn.apply(this, [].slice.call(arguments));
};

<强>更新

根据您的评论,听起来您不仅要覆盖原始功能,还要阻止外部脚本重新定义该功能。您可以添加无操作设置器,以避免外部脚本在尝试定义时出错:

Object.defineProperty(window, 'originalFunction', { 
  get: function() { 
    return overridingFunction; 
  },
  set: function(ignored) { } 
});