以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
27. 实现completeAssign()

解题思路:

本题目相对于上一题的实现 Object.assign() 多了以下性质:

  • 需要拷贝继承自原型链对象的属性。
  • 需要拷贝描述符类型为 accessor 的属性。

通过 Object.getOwnPropertyDescriptor() 拿到属性描述符,再通过 Object.defineProperty() 将属性描述符应用到目标对象上即可实现继承属性和复制描述符。

同时需要注意的是,由于 Object.assign() 只会处理对象自身能够枚举的属性,因此需要使用 Object.getOwnPropertyDescriptors() 来获取对象自身所有的属性描述符。

代码实现如下:

function completeAssign(target, ...sources) {
  sources.forEach(source => {
    if (source == null) return; // 如果源头为 null 或者 undefined 直接返回

    Object.getOwnPropertyNames(source).concat(
      Object.getOwnPropertySymbols(source)
    ).forEach(prop => {
      const descriptor = Object.getOwnPropertyDescriptor(source, prop);
      // 复制继承自原型链的属性
      if (descriptor && !(prop in target)) {
        Object.defineProperty(target, prop, descriptor);
      }
    });
  });
  return target;
}