javascript:如何覆盖某个类的所有实例的方法

javascript: How to override a method for all the instances of some class?

本文关键字:方法 实例 何覆盖 覆盖 javascript      更新时间:2023-09-26
function Person(){
    this.scream = function(){
        alert('NO NO NO!!!!');
    };
}
var steve = new Person();
steve.scream() // NO NO NO!!!!
Person.prototype.scream = function(){
    alert('YES YES YES!!!!');
}
steve.scream() // still NO NO NO!!!!

是否有一种方法可以覆盖'尖叫'而不显式引用steve ?考虑有多个Person实例的情况。

不,

有了Person声明,每次你为它创建一个新的"实例"时,"构造函数"都会运行,你将创建一个全新的scream函数(闭包),除了新创建的对象steve.scream之外,你没有任何引用。

作为一种选择,你可以这样做:

function Person(){}
Person.prototype.scream = function(){
    alert('NO NO NO!!!!');
}
var steve = new Person();
steve.scream() // NO NO NO!!!!
Person.prototype.scream = function(){
    alert('YES YES YES!!!!');
}
steve.scream() // this time is YES YES YES!!!!

在这种情况下,初始scream"方法"仅在原型上的一个地方可用,并且您可以为所有"实例"覆盖它。

function Person(){};
Person.prototype.scream = function(){ alert('NO NO NO!!!!'); };
var steve = new Person();
steve.scream();
Person.prototype.scream = function(){alert('YES YES YES!!!!');};
steve.scream();

,如果你想继续使用你的代码风格,你可能喜欢

function Person(){
    this.constructor.prototype.scream = function(){
        alert('NO NO NO!!!!');
    };
}
var steve = new Person();
steve.scream();
Person.prototype.scream = function(){ alert('YES YES YES!!!!'); };
steve.scream();