Javascript 这是真的吗;s原型无法覆盖公共成员?
例1: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 (){
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中,首先找到并执行localcolor
-方法。本地方法和原型方法是不同的方法,如下所示:
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实例变量(真正的私有变量)的术语方面造成很大的问题。