将属性放在“this”时为什么不保留引用?

时间:2015-06-29 10:13:10

标签: javascript

为什么以下代码记录空数组,而不是加载的数组:



function Car() {
  var parts = [];
  
  this.parts = parts;
  this.loadParts = loadParts;
  
  function loadParts() {
    parts = ['engine', 'wheels'];
  }
}

var audi = new Car();
audi.loadParts();
console.log(audi.parts);




(试图实现揭示模式)

4 个答案:

答案 0 :(得分:6)

您正在操纵已关闭的本地变量parts,而不是this.parts

将您的代码更新为:

function loadParts() {
  this.parts = ['engine', 'wheels'];
}

获得更可预测的结果。

答案 1 :(得分:1)

问题是您的代码重新分配了本地private myEntities entities = new myEntities(); var roleMenuMappings = entities.SystemRoles.Where( x => x.EmployeeRoleMenuMappings.Select( m => m.MasterAppMenu.ParentMenuId==null ) ); var roleMenuList = await roleMenuMappings.ToListAsync(); return View(roleMenuList); 变量,该变量最终指向与parts不同的数组。

解决方案是将代码更改为:

this.parts

这将改变相同数组的内容。

在Javascript中的代码

function loadParts() {
    parts.splice(0, parts.length, 'engine', 'wheels');
}

不会更改var x = [1, 2, 3]; var y = x; x = [4, 5, 6] 指向的内容。

这是您的代码正在执行的操作(yy)。

答案 2 :(得分:1)

因为您使用全新数组parts覆盖parts = ['engine', 'wheels']数组。

this.parts是对原始数组parts = [];的部分值的引用。

您要么填充原始数组:

function loadParts() {
    parts.push('engine');
    parts.push('wheels');
}

或者将this.parts的引用设置为新数组

function loadParts() {
    parts = ['engine', 'wheels'];
    this.parts = parts;
}

答案 3 :(得分:1)

当你为一个对象/数组赋值时,它将包含值的引用,并且它就像你在这里所做的那样丢失它自己的引用:

   this.parts = parts;

现在当你这样做时:

  function loadParts() {
    parts = ['engine', 'wheels'];
  }

parts丢失了自己的引用,它不再等于this.parts,我建议您只将数据推送到parts数组

  function loadParts() {
    parts.push('engine', 'wheels');
  }