js 实现extend
实现 extend 功能
在 JavaScript 中,extend 通常用于将一个对象的属性复制到另一个对象中。可以通过多种方式实现这一功能。
使用 Object.assign
Object.assign 是 ES6 提供的方法,用于将一个或多个源对象的可枚举属性复制到目标对象中。

const extend = (target, ...sources) => {
return Object.assign(target, ...sources);
};
const obj1 = { a: 1 };
const obj2 = { b: 2 };
const result = extend(obj1, obj2);
console.log(result); // { a: 1, b: 2 }
手动实现 extend
如果不使用 Object.assign,可以手动遍历源对象的属性并复制到目标对象中。

const extend = (target, ...sources) => {
sources.forEach(source => {
for (const key in source) {
if (source.hasOwnProperty(key)) {
target[key] = source[key];
}
}
});
return target;
};
const obj1 = { a: 1 };
const obj2 = { b: 2 };
const result = extend(obj1, obj2);
console.log(result); // { a: 1, b: 2 }
深拷贝实现
如果需要深拷贝(嵌套对象的属性也被复制),可以使用递归的方式实现。
const extendDeep = (target, source) => {
for (const key in source) {
if (source.hasOwnProperty(key)) {
if (typeof source[key] === 'object' && source[key] !== null) {
target[key] = Array.isArray(source[key]) ? [] : {};
extendDeep(target[key], source[key]);
} else {
target[key] = source[key];
}
}
}
return target;
};
const obj1 = { a: { b: 1 } };
const obj2 = { a: { c: 2 } };
const result = extendDeep(obj1, obj2);
console.log(result); // { a: { b: 1, c: 2 } }
使用 lodash 的 extend
如果项目中已经使用了 lodash,可以直接使用 _.extend 或 _.assign 方法。
const _ = require('lodash');
const obj1 = { a: 1 };
const obj2 = { b: 2 };
const result = _.extend(obj1, obj2);
console.log(result); // { a: 1, b: 2 }
注意事项
Object.assign和手动实现的extend都是浅拷贝,只会复制对象的顶层属性。- 深拷贝实现会递归复制嵌套对象,但可能会遇到循环引用的问题。
- 使用 lodash 的
_.extend或_.assign可以更方便地实现功能,但需要引入额外的库。






