我正在尝试用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 originalFunction
和ReferenceError: anotherEssentialFunction is not defined
在这种情况下是预期的,还是应该有其他问题造成这里没有描述?如何在不导致此类错误的情况下安全地覆盖原始功能?
答案 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) { }
});