Javascript 覆盖函数(例如“警报”)并调用原始函数?

Javascript 覆盖函数(例如“警报”)并调用原始函数?,javascript,overriding,Javascript,Overriding,我想用一个调用原始函数的新版本覆盖Javascript内置函数(类似于用一个在许多语言中调用super的版本覆盖类上的方法)。我该怎么做 例如 window.alert = function(str) { //do something additional if(console) console.log(str); //super.alert(str) // How do I do this bit? } 将对原始函数的引用存储在变量中: (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
    };
})();
(函数(){

var _alert=window.alert;//我假设您的问题是如何覆盖内置并仍然能够调用它。首先,作为免责声明,您不应该覆盖内置,除非您有很好的理由这样做,因为这样做会使调试/测试变得不可能

这就是你要做的:

window._alert = window.alert;
window.alert = function(str) { 
     if(console) console.log(str);
     window._alert(str);
}
没有“super”。无论如何,创建一个闭包来“保留”原始函数对象

请注意返回新函数对象(分配给
窗口.alert
属性)的“自调用函数”。返回的新函数对象围绕变量
original
创建一个闭包,该变量的计算结果为传递给“自调用函数”的
窗口.alert
的原始值

然而,我相信一些浏览器可能会阻止
警报
和其他内置程序被修改


愉快的编码。

JavaScript不使用经典继承模型。有一个nice描述了一种编写类的方法,这样可以使用类似的语法,但它本身不受支持。

如何在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”成为“保留”字:-)

注意:这种方法不容易扩展。调用同一代码两次,就会丢失原始方法。如果只设置了窗口,则不会。如果未定义,则发出警报。类似但稍微复杂的情况:显示覆盖警报:我删除了“OO”和“superclass”标签,因为它们不适用。但这个问题包括嘲笑“超级”在JavaScript中:刚刚测试过:所有主要浏览器都允许修改全局
窗口。alert
,除了IE@Rob谢谢提醒。你注意到其他内置函数的IE问题了吗?@ring0基本上每个内置的:
确认
文档
,…如果你想拦截
窗口。alert
调用s、 您可以将代码包装在一个闭包中,其中声明并定义了自定义的
窗口
(或
警报
)变量。如果您的应用程序不依赖隐式变量声明,这将始终有效。@RobW即使这篇文章很老,刚刚在IE 7.0.6002.18005(Vista)和IE 8.0.6001.18702(Win XP)中测试过警报覆盖JeremyS。哦,你说得对。当我写那句话时,我使用了
alert=…
。这会抛出一个错误。但是如果你使用
window.alert=…
,那么一切都会按预期工作。这是一个非常优雅的闭包用法。绝对是我见过的最小的闭包足迹。
Function.prototype.override = function(func)
{
 var superFunction = this;
 return function() 
 {
  this.superFunction = superFunction;
  return func.apply(this,arguments);
 };
};