27. 实现completeAssign()
分享给更多人
中等难度 -通过 / -执行
本题是 26. 实现Object.assign()的延续。
Object.assign()
处理的是可枚举属性,所以getters不会被复制,不可枚举属性被忽略。
假设我们有如下的object。
const source = Object.create(
{
a: 3 // prototype
},
{
b: {
value: 4,
enumerable: true // 可枚举 data descriptor
},
c: {
value: 5, // 不可枚举data descriptor
},
d: { // 不可枚举 accessor descriptor
get: function() {
return this._d;
},
set: function(value) {
this._d = value
}
},
e: { // 可枚举 accessor descriptor
get: function() {
return this._e;
},
set: function(value) {
this._e = value
},
enumerable: true
}
}
)
如果我们调用 Object.assign()
的话,我们得到的是
Object.assign({}, source)
// {b: 4, e: undefined}
// e 是undefined 因为 `this._e` 是undefined
这也许不是我们想要的结果,你能否实现一个completeAssign()
,使得data descriptors和 accessor descriptors都能被拷贝?
如果你还不熟悉descriptors,请参照MDN的说明。
该问题单纯地想要考考你对descriptors的理解。
祝你好运!