![](/img/trans.png)
[英]JS ES5 OOP: private instance member via get/set in constructor
[英]ES5 puzzle of private variable defined in constructor
我正在阅读“面向Web开发人员的专业JavaScript第三版”中的“ 私有变量”部分,并对示例代码之一感到困惑:
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
不再是同一构造函数的实例,但除此之外,单独的变量实例和作用域的原理是相同的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.