我正在阅读《Web 开发人员专业 JavaScript 第三版》中的私有(private)变量部分,并对示例代码之一感到困惑:
function Person(name) {
this.setName = function(value) {
name = value;
}
this.getName = function() {
return name;
}
}
var person1 = new Person('p1');
person1.setName('p11');
person1.getName(); // 'p11'
var person2 = new Person('p2');
person2.getName(); // 'p2'
getName()
方法通过闭包和作用域链访问 name
变量,而 setName()
方法则分配一个新值到名称
。
问题:
name
变量存在于哪里?
为什么Person
的每个实例都有不同的name
,这样如果一个实例修改name
变量,就不会影响其他实例?
======================================
我认为每次使用new
创建实例时,都会创建一个人员激活对象
。每个人员激活对象
中的name
变量都是不同的。
请您参考如下方法:
此行为与new
无关。
每次调用 Person
时,都会创建参数变量 name
的一个新的单独实例。该函数内的代码可以访问该变量。没有更多的事情了。
对于您可能声明的每个函数中的参数变量来说都是如此。只要可以引用这些变量,它们就会保留在内存中——它们不会被垃圾回收。
调用 Person
两次,本质上与调用两个具有相同参数和方法的不同函数没有太大区别:
function Person1(name) {
this.setName = function(value) {
name = value;
}
this.getName = function() {
return name;
}
}
function Person2(name) {
this.setName = function(value) {
name = value;
}
this.getName = function() {
return name;
}
}
var person1 = new Person1('p1');
person1.setName('p11');
person1.getName(); // 'p11'
var person2 = new Person2('p2');
person2.getName(); // 'p2'
当然,这里的person1
和person2
不再是同一个构造函数的实例,但除此之外,单独的变量实例和作用域的原理是相同的。