让我们考虑这种情况:
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
为什么 firstObject
和 secondObject
都返回 3?
原型(prototype)链在这里是如何工作的?
最佳答案
因为 Object.assign
的第一个参数是要分配给 的对象。然后 Object.assign
返回对该对象的引用。它分配 from 后续参数,但您没有提供任何参数。所以最终的结果是 firstObject
和 secondObject
只是指向同一个对象:
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.assign
将 a
的 value 从 firstObject
复制到新对象,而不是它的属性描述符。所以 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/