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