Javascript 这是真的吗;s原型无法覆盖公共成员?

Javascript 这是真的吗;s原型无法覆盖公共成员?,javascript,Javascript,例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 (){

例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中,首先找到并执行local
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

示例2有缺陷,因为
var color=function()…
实际上没有将
color
函数附加到
Cat
。我认为这不是缺陷,当你告诉人们“私有”变量存在时会发生这种情况。他们没有
color
是一个局部变量要理解示例1的工作方式,您需要了解JS范围链和标识符解析。首先(标题为“范围链和标识符解析”的部分应该足够了)然后@Kooilnc当然不行。这将在ES6实例变量(真正的私有变量)的术语方面造成很大的问题。