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

祝你好运!

普通解法但是bugfree胜于奇技淫巧但是各种bug。

(37)