27. 实现completeAssign()

JavaScript

中等难度  -通过 / -执行

本题是 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的理解。

祝你好运!

始终思考更好的解决办法