我正在阅读《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' 

当然,这里的person1person2不再是同一个构造函数的实例,但除此之外,单独的变量实例和作用域的原理是相同的。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!