构造函数中定义的私有变量的ES5谜题
ES5 puzzle of private variable defined in constructor
我正在阅读"Professional JavaScript for Web Developers 3rd Edition"中的私有变量部分,对其中一个示例代码感到困惑:
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
。
问题:
name
变量在哪里?
为什么 Person
的每个实例都有不同的 name
,这样如果一个实例修改 name
变量就不会影响其他实例?
====================================
我认为每次使用 new
创建实例时,都会创建一个 Person Activation Object
。每个 Person Activation Object
中的 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
不再是同一个构造函数的实例,但除此之外变量实例和作用域分开的原理是一样的
我正在阅读"Professional JavaScript for Web Developers 3rd Edition"中的私有变量部分,对其中一个示例代码感到困惑:
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
。
问题:
name
变量在哪里?
为什么 Person
的每个实例都有不同的 name
,这样如果一个实例修改 name
变量就不会影响其他实例?
====================================
我认为每次使用 new
创建实例时,都会创建一个 Person Activation Object
。每个 Person Activation Object
中的 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
不再是同一个构造函数的实例,但除此之外变量实例和作用域分开的原理是一样的