Javascript 为什么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

这是我的密码。我很好奇prototype.setName和this.setName有什么不同。为什么调用
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
下的闭包!