覆盖function(如“警报”),并调用原来的function?

我想重写一个新的版本,调用原来的JavaScript内置函数(类似的重写在一个类的方法调用super在许多语言的版本)。 我该怎么做?

例如…

 window.alert = function(str) { //do something additional if(console) console.log(str); //super.alert(str) // How do I do this bit? } 

将原始函数的引用存储在一个variables中:

 (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)就足够了。

注意:如果您尝试覆盖alert ,则IE <= 8将引发错误,因此请确保使用window.alert = ...而不是alert = ...

没有“超级”。 无论如何,创build一个闭包来“保持”原来的function对象。

请注意“自调用函数”,它返回一个新的函数对象(分配给window.alert属性)。 返回的新的函数对象在variables原始周围创build了一个闭包,该variables的原始是传递给“自调用函数”的window.alert的原始

 window.alert = (function (original) { return function (str) { //do something additional if(console) { console.log(str) } original(str) } })(window.alert) 

但是,我相信一些浏览器可能会阻止alert和其他内置修改…

快乐的编码。

我假设你的问题是你如何覆盖一个内置的,仍然可以调用它。 首先,作为一个免责声明,除非你有足够的理由去做,否则你不应该覆盖内置的ins,因为这将导致debugging/testing无法进行。

这是你如何做到这一点:

 window._alert = window.alert; window.alert = function(str) { if(console) console.log(str); window._alert(str); } 

如何在JavaScript中做简单的经典inheritance:

 SuperClass.call(this) // inherit from SuperClass (multiple inheritance yes) 

如何覆盖function:

 this.myFunction = this.myFunction.override( function(){ this.superFunction(); // call the overridden function } ); 

覆盖function是这样创build的:

 Function.prototype.override = function(func) { var superFunction = this; return function() { this.superFunction = superFunction; return func.apply(this,arguments); }; }; 

与多个参数一起工作。
尝试覆盖未定义或无function时失败。
使“超级function”成为“保留”一词:-)

JavaScript不使用经典的inheritance模型。 这里有一篇很好的文章,它描述了一种编写你的类的方法,以便可以使用类似的语法,但是它不是本地支持的。