javascript - 使用 Object.assign 和描述符的原型(prototype)链

标签 javascript

让我们考虑这种情况:

var firstObject = {
  set a(val) {
  	this._a_ = val;
  },
  get a() {
  	return this._a_;
  }
}

var secondObject = Object.assign(firstObject);

secondObject.a = 3;

console.log(secondObject.a); // 3
console.log(firstObject.a); // 3

console.log(secondObject.hasOwnProperty('a')); // true
console.log(firstObject.hasOwnProperty('a')); // true

为什么 firstObjectsecondObject 都返回 3? 原型(prototype)链在这里是如何工作的?

最佳答案

因为 Object.assign 的第一个参数是要分配给 的对象。然后 Object.assign 返回对该对象的引用。它分配 from 后续参数,但您没有提供任何参数。所以最终的结果是 firstObjectsecondObject 只是指向同一个对象:

var firstObject = {
  set a(val) {
  	this._a_ = val;
  },
  get a() {
  	return this._a_;
  }
}

var secondObject = Object.assign(firstObject);
console.log("Same object? " + (firstObject === secondObject));

你想要:

var secondObject = Object.assign({}, firstObject);
// Note -------------------------^^^^

另请注意,Object.assignavaluefirstObject 复制到新对象,而不是它的属性描述符。所以 secondObject 上的 a 属性只是一个简单的属性,而不是访问器。

这是一个包含上述更改的片段,并在末尾显示每个对象的描述符:

var firstObject = {
  set a(val) {
  	this._a_ = val;
  },
  get a() {
  	return this._a_;
  }
}

var secondObject = Object.assign({}, firstObject);

secondObject.a = 3;

console.log(secondObject.a); // 3
console.log(firstObject.a);  // undefined

firstObject.a = 42;
console.log(firstObject.a);  // 42
console.log(secondObject.a); // still 3

console.log(
  "firstObject's a descriptor:",
  Object.getOwnPropertyDescriptor(firstObject, "a")
);
console.log(
  "secondObject's a descriptor:",
  Object.getOwnPropertyDescriptor(secondObject, "a")
);


另请注意,作为 Mister Epic pointed out ,这里根本没有真正使用原型(prototype)链。 firstObject 有一个自己的属性a,在复制之后,secondObject 也有。 secondObject 不继承自 firstObject 或类似的东西; Object.assign 复制 属性。

关于javascript - 使用 Object.assign 和描述符的原型(prototype)链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39818541/

相关文章:

c# - 在 asp.net 中读取隐藏的控件值

javascript - 重新加载时文本随机播放

javascript - 使用 Google Maps v3 拖动(移动)多边形

javascript - Angular JS : unable to display value

javascript - 推迟尺寸计算直到 ui 呈现

javascript - 发送 AJAX 请求时会触发什么事件?

javascript - 文字和对象——什么时候使用什么?

php - $.post 函数未返回正确的数据

javascript - 使用 agm 库在 Angular 2 中创建多边形

javascript - highcharts 中没有显示 y 轴的滚动条?