构造函数的原型不能覆盖公共成员,这是真的吗?

Is it true constructor's prototype cannot overwrite public members?

本文关键字:成员 是真的吗 原型 不能 覆盖 构造函数      更新时间:2023-09-26

示例1:

function Cat(){
    this.color = function (){
        return "Green";
    };
}
Cat.prototype.color = function(){
    return "Blue";
}
var kitty = new Cat();
alert(kitty.color()); // Green

示例2:

function Cat(){
    var color = function (){
        return "Green";
    };
}
Cat.prototype.color = function(){
    return "Blue";
}
var kitty = new Cat();
alert(kitty.color()); // Blue

示例2返回Blue,是因为构造函数不能覆盖公共成员还是它不能访问私有成员?

例2没有对构造函数中的color做任何操作,因为它不是一个属性,而是它作用域中的一个函数。例如1,您应该意识到查找属性从本地属性开始,如果没有找到,则继续查找属性原型。因此,在例1中,首先找到本地color方法并执行。局部方法和原型方法是不同的方法,如下所示:

function Cat(){
    this.color = function (){
        return Cat.prototype.color ? Cat.prototype.color() : "Green";
    };
}
Cat.prototype.color = function(){
    return "Blue";
}
var prrr = new Cat;
alert(prrr.color()); //=> Blue

所以从这个意义上说,你的问题的答案是:是的。但不在:

function Cat(){
    this.color = function (){
        return Cat.prototype.color ? Cat.prototype.color() : "Green";
    };
}
Cat.prototype.color = function(){
    if (this.color && !this.colorOverwritten) {
        this.color = function(){return "Orange";};
        this.colorOverwritten = true;
    }
    return "Blue";
}
var prrr = new Cat;
alert(prrr.color()); //=> Blue
alert(prrr.color()); //=> Orange