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

时间:2011-10-06 11:10:50

标签: javascript oop aop

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!!!!

有没有办法在不明确引用史蒂夫的情况下覆盖' 尖叫 '?考虑一下您可能有 的情况。

3 个答案:

答案 0 :(得分:2)

没有

拥有Person声明,每次你创建一个新的“实例”时,“构造函数”将运行,你将创建一个全新的scream函数(闭包),你不能t除了新创建的对象之外,还有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“方法”仅在原型上的一个位置可用,您可以为所有“实例”覆盖它。

答案 1 :(得分:1)

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();

答案 2 :(得分:0)

并且,如果您想继续使用您的代码样式,您可能会喜欢

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();