function Person(name){
var age;
this.name = name;
this.setAge = function(a){
age = a;
}
this.getAge = function(){
return age;
}
}
var p0 = new Person("John");
p0.setAge(24);
console.log("p0.getAge "+p0.getAge());//p0.getAge 24
var p1 = new Person("Mike")
p1.setAge("25");
console.log("p0.getAge "+p0.getAge());//I think the output here should be p0.getAge 25,but it is p0.getAge 24
console.log("p1.getAge "+p1.getAge());//p0.getAge 25
变量“age”不属于Person的任何实例,因为Person的构造函数中没有“this.age”,它应该首先由Person的实例共享,但结果不是我预期的。我很困惑!
答案 0 :(得分:3)
function Person(name){
var age;
this.name = name;
this.setAge = function(a){
age = a;
}
this.getAge = function(){
return age;
}
}
看var age;
,你不要声明this.age
,当你不想从外面直接访问变量时,尤其如此,即你试图让它对那个对象是私有的,这就是为什么你不要&# 39; t为对象创建一个属性,但只是该闭包的变量。
仍然可以在对象内部访问它并使用getAge
方法返回它,但不能直接使用年龄。所以没有属性age
,但存在变量age
答案 1 :(得分:0)
即使age
“属性”未被隐式声明为实例变量,但其范围包含在函数中。每次调用setAge()
方法时,都会为age
变量设置新值,如果您未在对象上调用setAge()
,则age
将为undefined,这是未初始化变量的默认值。它不是全局变量,因此不会跨对象共享。
答案 2 :(得分:0)
变量的范围在函数中,代码工作正常。
如果您期望单个变量,外部变量或Person.age是好方法。
答案 3 :(得分:0)
function Person(name){
var age; //private variable
this.name = name;
this.setAge = function(a){
age = a;
}
this.getAge = function(){
return age;
}
}
你已经关闭了。 closure
是一个私人环境。或者在闭包(函数)中声明的变量只能用于该函数。您已经创建了构造函数person
的两个实例。解析器创建了两个单独的对象,每个对象包含它自己的私有变量age
。因此,当您在setAge
上致电John
时,他的私有变量age
会更新,但Mike
的私有变量保持不变。变量只能在自己的范围内访问,而不能在全局范围内访问。请注意,变量未连接到实例John
。要使变量公开,您需要在构造函数函数中执行此操作:this.age
。
对于getter和setter,有一个新功能(在现代浏览器中可用)
一个例子:
function Person(name){
var age; //private variable
this.name = name;
var age = 0;
Object.defineProperty(this, "age", {
get : function(){return age;}, //has access to the private var `age` in this scope.
set : function(value){age = value;}
});
}
现在当您通过John
致电p0.age
的年龄时,您会得到0.但是当您执行p0.age = 10
时,它会将私有变量age
设置为10。