返回

浅拷贝两大神器,你真的懂嘛?

前端

对象操作的强大工具:Object.assign() 和 Object.create()

在 JavaScript 中,我们经常需要处理对象的属性和继承关系。Object.assign() 和 Object.create() 这两个方法提供了灵活多变的解决方案,帮助我们轻松完成这些任务。

一、Object.assign():灵活多变的浅拷贝工具

想象一下这样的场景:你有一个目标对象,需要从多个源对象中提取属性并复制到目标对象中。Object.assign() 方法就是你的超级帮手!它可以实现浅拷贝,这意味着它只复制源对象的可枚举属性 ,不会触及原型属性。

语法:

Object.assign(target, ...sources)
  • target: 目标对象,接收源对象属性。
  • sources: 一个或多个源对象。

示例:

const source1 = {
  name: '小明',
  age: 18
};

const source2 = {
  city: '上海',
  country: '中国'
};

const target = {};

Object.assign(target, source1, source2);

console.log(target); // { name: '小明', age: 18, city: '上海', country: '中国' }

注意:

  • 只能复制可枚举属性。
  • 不会覆盖目标对象的已有属性。
  • 可以进行链式调用。

二、Object.create():创建新对象的利器

当你想创建一个新对象,并继承某个对象的属性和方法时,Object.create() 方法闪亮登场!它创建的新对象拥有指定的原型对象,继承所有属性和方法。

语法:

Object.create(prototype, propertiesObject)
  • prototype: 新对象的原型对象。
  • propertiesObject: 包含新对象属性和方法的对象。

示例:

const person = {
  name: '小明',
  age: 18
};

const student = Object.create(person, {
  school: {
    value: '清华大学',
    enumerable: true
  }
});

console.log(student); // { name: '小明', age: 18, school: '清华大学' }

注意:

  • 新对象始终是空对象,即使指定了属性。
  • 会复制所有属性,包括不可枚举属性。
  • 可以覆盖新对象的已有属性。
  • 返回的是新对象,可进行链式调用。

三、Object.assign() 与 Object.create() 的区别

  • 目的:assign() 用于浅拷贝,create() 用于创建新对象并指定原型。
  • 属性复制:assign() 只复制可枚举属性,create() 复制所有属性。
  • 属性覆盖:assign() 不会覆盖目标对象属性,create() 会覆盖新对象属性。
  • 返回值:assign() 返回目标对象,create() 返回新对象。

四、应用场景

Object.assign():

  • 从多个源对象中提取属性到目标对象。
  • 创建具有特定属性的新对象,避免重复创建。
  • 动态修改对象,添加或删除属性。

Object.create():

  • 创建继承自其他对象的子对象。
  • 模拟面向对象编程中的继承。
  • 扩展对象,添加新的方法和属性。

五、常见问题解答

  1. 浅拷贝和深拷贝有什么区别?
    浅拷贝只复制源对象的引用,而深拷贝会创建新对象并复制所有值。
  2. 为什么 Object.create() 创建的子对象属性始终是不可枚举的?
    因为新对象继承的属性来自原型对象,而原型对象的属性通常是不可枚举的。
  3. 可以使用 Object.create() 模拟类吗?
    可以,但 JavaScript 中没有真正的类。
  4. Object.assign() 可以用于合并数组吗?
    可以,但只能合并数组的浅拷贝。
  5. Object.create() 和 ES6 类的区别是什么?
    Object.create() 创建的子对象没有 constructor,而 ES6 类创建的子对象具有 constructor。

掌握了 Object.assign() 和 Object.create() 的使用,你将成为 JavaScript 对象操作的专家,轻松应对各种数据处理场景。