📋 介绍 ★
Object.assign 是 JavaScript 的内置方法,用于合并多个对象的属性。
🎯 核心作用 ★
将 一个或多个源对象的属性 复制到目标对象。
📝 基本语法 ★
Object.assign(目标对象, 源对象1, 源对象2, ...)
Object.assign() 返回 目标对象。
💡 经典示例 ★★
const target = { a: 1, b: 2 }
const source = { b: 3, c: 4 }
//因 Object.assign - 返回目标对象 所以 result 就是 target 。
const result = Object.assign(target, source)
console.log(result) // { a: 1, b: 3, c: 4 }
console.log(target) // { a: 1, b: 3, c: 4 } - 目标对象target 被修改
🔧 实际应用场景
1. 合并对象
const defaults = { theme: 'light', fontSize: 14 }
const userSettings = { fontSize: 16, language: 'zh' }
const settings = Object.assign({}, defaults, userSettings)
// { theme: 'light', fontSize: 16, language: 'zh' }
2. 浅拷贝对象
const obj = { a: 1, b: { c: 2 } }
const copy = Object.assign({}, obj)
console.log(copy) // { a: 1, b: { c: 2 } }
3. 添加属性
class User {
constructor(name) {
Object.assign(this, { name, createdAt: new Date() })
}
}
const user = new User('张三')
// { name: '张三', createdAt: 2024-01-20T10:30:00.000Z }
⚡ 主要特点
优点
✅ 简单易用:一行代码合并对象
✅ 原生支持:ES6 标准,无需引入库
✅ 性能较好:比手动复制快
注意事项
⚠️ 浅拷贝:只复制第一层,嵌套对象是引用
⚠️ 修改目标:第一个参数会被修改
⚠️ 覆盖顺序:后面对象的属性覆盖前面的
🔄 与展开运算符对比
| 特性 | Object.assign | 展开运算符 ... |
|---|---|---|
| 语法 | 方法调用 | 语法糖 |
| 目标修改 | 会修改 | 不修改 |
| 可读性 | 较明确 | 更简洁 |
| ES版本 | ES6 | ES6+ |
| 性能 | 略快 | 略慢 |
// 相同效果
const obj1 = Object.assign({}, a, b)
const obj2 = { ...a, ...b }
📈 实际应用
1. 表单数据合并
// 更新表单数据
const formData = { name: '张三', age: 25 }
const updates = { age: 26, city: '北京' }
// 合并更新
const newFormData = Object.assign({}, formData, updates)
// { name: '张三', age: 26, city: '北京' }
2. 配置合并
// 默认配置
const defaultConfig = { timeout: 5000, retry: 3 }
// 用户配置
const userConfig = { timeout: 10000 }
// 合并配置
const config = Object.assign({}, defaultConfig, userConfig)
// { timeout: 10000, retry: 3 }
3. 添加方法
// 为对象添加方法
const calculator = { value: 0 }
Object.assign(calculator, {
add(x) { this.value += x; return this },
multiply(x) { this.value *= x; return this }
})
calculator.add(5).multiply(2)
console.log(calculator.value) // 10
💡 浅拷贝问题
// 注意:嵌套对象是引用
const obj1 = { a: 1, b: { c: 2 } }
const obj2 = Object.assign({}, obj1)
obj2.b.c = 3
console.log(obj1.b.c) // 3!obj1 也被修改了
🎓 记住这几点
- 目标修改:第一个参数会被修改
- 属性覆盖:后面对象的属性覆盖前面的
- 浅拷贝:只复制第一层
- 返回目标:返回修改后的目标对象
- ES6标准:现代浏览器都支持
📋 总结
Object.assign 是 JavaScript 中合并对象的常用方法,适合简单的对象合并和浅拷贝场景。
