📋 介绍

Object.assignJavaScript 的内置方法,用于合并多个对象的属性

🎯 核心作用

将 一个或多个源对象的属性 复制到目标对象。

📝 基本语法

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 也被修改了

🎓 记住这几点

  1. 目标修改:第一个参数会被修改
  2. 属性覆盖:后面对象的属性覆盖前面的
  3. 浅拷贝:只复制第一层
  4. 返回目标:返回修改后的目标对象
  5. ES6标准:现代浏览器都支持

📋 总结

Object.assign 是 JavaScript 中合并对象的常用方法,适合简单的对象合并和浅拷贝场景。