覆盖函数(例如“alert”)并调用原始函数
Override function (e.g. "alert") and call the original function?
我想用调用原始函数的新版本覆盖Javascript内置函数(类似于用许多语言调用super
的版本覆盖类上的方法)。我该怎么做?
例如。。。
window.alert = function(str) {
//do something additional
if(console) console.log(str);
//super.alert(str) // How do I do this bit?
}
在变量中存储对原始函数的引用:
(function() {
var _alert = window.alert; // <-- Reference
window.alert = function(str) {
// do something additional
if(console) console.log(str);
//return _alert.apply(this, arguments); // <-- The universal method
_alert(str); // Suits for this case
};
})();
通用方法是<original_func_reference>.apply(this, arguments)
- 保留上下文并传递所有参数。通常,还应返回原始方法的返回值。
但是,众所周知,alert
是一个 void 函数,只接受一个参数,并且不使用this
对象。因此,在这种情况下,_alert(str)
就足够了。
注意:如果您尝试覆盖 IE <= 8 会抛出错误alert
,因此请确保您使用的是 window.alert = ...
而不是 alert = ...
。
没有"超级"。无论如何,创建一个闭包来"保留"原始函数对象。
请注意返回新函数对象(分配给 window.alert
属性)的"自调用函数"。返回的新函数对象在变量original
周围创建一个闭包,该闭包的计算结果为传递给"自调用函数"的原始值window.alert
。
window.alert = (function (original) {
return function (str) {
//do something additional
if(console) {
console.log(str)
}
original(str)
}
})(window.alert)
但是,我相信某些浏览器可能会阻止修改alert
和其他内置...
快乐编码。
我假设您的问题是如何覆盖内置并仍然能够调用它。首先作为免责声明,除非你有充分的理由这样做,否则你永远不应该覆盖内置的,因为它会使调试/测试变得不可能。
这是您将如何做到这一点:
window._alert = window.alert;
window.alert = function(str) {
if(console) console.log(str);
window._alert(str);
}
如何在 Javascript 中进行简单的经典继承:
SuperClass.call(this) // inherit from SuperClass (multiple inheritance yes)
如何覆盖函数:
this.myFunction = this.myFunction.override(
function(){
this.superFunction(); // call the overridden function
}
);
覆盖函数的创建方式如下:
Function.prototype.override = function(func)
{
var superFunction = this;
return function()
{
this.superFunction = superFunction;
return func.apply(this,arguments);
};
};
适用于多个参数。
尝试覆盖未定义或非函数时失败。
使"superFunction"成为"保留"词:-)
JavaScript 不使用经典的继承模型。这里有一篇很好的文章,描述了一种编写类的方法,以便可以使用类似的语法,但它本身不受支持。
通过使用代理对象,您可以执行此操作。
window.alert = new Proxy(window.alert , {
apply: function(target,that,args){
console && console.log(args.join(''n'));
target.apply(that,args)
}})
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 我如何制作一个JS函数,它可以从相似的原始颜色双向更改为某个颜色
- jQuery's clone()函数扰乱了原始元素'的属性
- 为什么Coderbyte.com's的Javascript模板喜欢返回函数的原始参数
- 当将函数传递给方法时,为什么使用匿名函数容器而不仅仅是原始函数有效
- 如何将函数的参数重新分配回原始参数名称
- 函数中的拾取参数和使用原始参数的回调
- 两个函数使用相同的变量,都不会覆盖其原始变量
- jQuery 在缓存中预加载图像并在其他函数继续之前获取原始图像大小
- 如何在 JavaScript 中覆盖全局函数,但保留对原始函数的引用
- 在 JavaScript 函数之后保留原始数组
- 覆盖函数(例如“alert”)并调用原始函数
- 用于复制可能影响原始数组的数组的函数
- 如何在 for 循环中维护迭代变量的原始值,该循环设置事件调用,其中迭代值是函数的一部分
- 将其绑定到高阶函数中的原始对象
- 如何在不影响原始函数的情况下扩展javascript中的静态函数(使用新名称)
- JavaScript __proto__将影响对象中的原始函数
- 用于编辑原始对象的JavaScript函数
- 有可能用我的新上下文而不是原始的应用程序上下文来伪造WebView的构造函数吗
- 保持原始数组不变,更改函数中的本地副本