以下为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;}