Javascript 为什么prototype.setName和this.setName可以返回不同的值?
这是我的密码。我很好奇prototype.setName和this.setName有什么不同。为什么调用Javascript 为什么prototype.setName和this.setName可以返回不同的值?,javascript,Javascript,这是我的密码。我很好奇prototype.setName和this.setName有什么不同。为什么调用p2.setName()时会得到相同的值p2?谢谢 function Person(){ var name = ''; } Person.prototype.setName = function (value){ name = value; } Person.prototype.getName = function (){ return name; } fun
p2.setName()
时会得到相同的值p2
?谢谢
function Person(){
var name = '';
}
Person.prototype.setName = function (value){
name = value;
}
Person.prototype.getName = function (){
return name;
}
function Sprite(){
var name = '';
this.setName = function (value){
name = value;
}
this.getName = function(){
return name;
}
}
var p1 = new Person();
p1.setName('p1');
var p2 = new Person();
p2.setName('p2');
console.log(p1.getName()) // p2
console.log(p2.getName()) // p2
var s1 = new Sprite('s1');
s1.setName('s1');
var s2 = new Sprite('s2');
s2.setName('s2');
console.log(s1.getName()); //s1
console.log(s2.getName()); //s2
因为你忘了这个:
Person.prototype.setName = function (value){
this.name = value;
}
Person.prototype.getName = function (){
return this.name;
}
这是一种令人困惑的设计模式。原因是您在Person()中声明的
name
变量只是该函数的局部变量,而不是与原型函数共享
因此,下面创建一个名为name
的新全局变量
Person.prototype.setName = function (value){
name = value;
}
由于变量是全局变量,因此它由p1
和p2
共享(请注意,如果添加“使用严格”;
以上内容会导致异常,而不是自动创建全局变量)
您应该按照@beautifulcoder的建议,使用this
将变量设置为对象的属性,如下所示
function Person(){
this.name = '';
}
Person.prototype.setName = function (value){
this.name = value;
};
Person.prototype.getName = function (){
return this.name;
};
最后,Sprite()工作的原因是set和get函数是在局部
name
变量的作用域内定义的,因此它们创建闭包并使用局部name
而不是创建全局变量。因为原型方法具有不同的作用域(a!)。它们不是Sprite
下的闭包!