有我的代码。我很好奇不同的prototype.setName
和this.setName
是什么。当我致电p2
时,为什么我获得相同的p2.setName()
值?感谢。
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
答案 0 :(得分:2)
原因是您在Person()中声明的name
变量只是该函数的本地变量,并且不与原型函数共享。
以下是创建一个名为name
的新全局变量。
Person.prototype.setName = function (value){
name = value;
}
由于变量是全局变量,因此p1
和p2
共享(请注意,如果添加'use strict';
,则会导致异常,而不是自动创建全局变量)。
你应该做@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
而不是创建全局变量。
答案 1 :(得分:0)
因为您忘记了this
:
Person.prototype.setName = function (value){
this.name = value;
}
Person.prototype.getName = function (){
return this.name;
}
这是一种令人困惑的设计模式。