javascript - 数组属性在JS对象中是如何工作的

标签 javascript

对于下面的代码,为什么更新了myObjpropB?为什么 test.childObj 没有自己的属性 propB

var myObj = { propA: '', propB: [] }
var fatherObj = {
    childObj: null,
    init: function() {
        this.childObj = Object.create(myObj);
        this.childObj.propA = 'A';
        this.childObj.propB.push(2);
    }
}

var test = Object.create(fatherObj);
test.init();

console.log(myObj.propB.length);
console.log(test.childObj.hasOwnProperty('propA'));
console.log(test.childObj.hasOwnProperty('propB'));

最佳答案

使用 Object.create 您不复制对象,而是创建一个继承传递对象的新对象:

  this.childObj { } ->  myObj { propA: "", propB: [] }

现在,当您获得一个属性时,它会在继承链中查找。由于无法在子对象中找到它,因此会在 myObj 中查找它。这通常不是问题,因为设置对象属性直接将其设置在对象本身上而不使用继承链,因此:

  this.childObj.propA += "test";

myObj 上查找 propA 但在 childObj 上设置 propA。但是,对于引用类型,您不会重写该属性,因此:

  this.childObj.propB.push(1);

myObj中查找propB,并向其推送,结果为:

 this.childObj { propA: "test" } ->  myObj { propA: "", propB: [1] }

要解决这个问题,childObj 必须有自己的 propB 数组:

 this.childObj.propB = this.childObj.propB.slice();

结果是:

 this.childObj { propA: "test", propB: [1] } ->  myObj { propA: "", propB: [1] }

现在推送到 propB 会推送到 childObj 中的数组。

关于javascript - 数组属性在JS对象中是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53534256/

相关文章:

javascript - 如何通过两个嵌套的匿名函数传递变量(带有超时的事件处理程序)

javascript - 欢乐 javascript 导入

javascript - JSONP 使用 Google Apps 脚本的 ContentService?

javascript - 试图理解 Webpack

javascript - 将值添加到另一个数组中的数组

javascript - 什么是 prototype.constructor 及其在原型(prototype)链中的作用 - Javascript

javascript - 从旧的indexedDB setVersion 升级到新的indexedDB.open 函数?

Javascript 模块模式

javascript - 更改为 Bluebird Promise,但使用 mongoose 仍然收到弃用警告,为什么?

javascript - Fabric.js - 将光标设置为自由绘图画笔大小和颜色