返回

深入探究 Object.create()、new Object() 和 {} 创建对象的异同

前端

前言

面向对象编程是一门广泛应用的编程范式,在前端开发中更是随处可见。然而,我们经常会疑惑:创建对象的方法何其之多?其中最常见的莫过于字面量方式,比如 let obj = {}。但是,还有 Object.create()new Object() 两种创建对象的方式,它们究竟有何异同?

1. 语法差异

字面量创建:

let obj = {};

Object.create() 创建:

let obj = Object.create(prototype);

new Object() 创建:

let obj = new Object();

2. 创建对象时的 prototype 设置

字面量创建:

原型为 Object.prototype

Object.create() 创建:

原型由 prototype 参数指定,默认值为 null,表示没有原型。

new Object() 创建:

原型为 Object.prototype

3. 内置方法和属性

字面量创建:

obj.hasOwnProperty("property"); // true
obj.toString(); // "[object Object]"

Object.create() 创建:

obj.hasOwnProperty("property"); // false
obj.toString(); // "[object Object]"

new Object() 创建:

obj.hasOwnProperty("property"); // true
obj.toString(); // "[object Object]"

4. 扩展能力

字面量创建:

可以使用扩展运算符直接扩展对象。

Object.create() 创建:

可以使用 Object.assign() 方法扩展对象。

new Object() 创建:

可以使用 Object.assign() 方法扩展对象。

5. 用例对比

字面量创建:

  • 创建一个新的空对象,一般用于临时存储数据。
  • 创建一个新对象,其属性和方法与另一个现有对象相同,但原型不同。

Object.create() 创建:

  • 创建一个新对象,其原型为指定的 prototype 对象。
  • 创建一个没有原型的空对象(当 prototypenull 时)。

new Object() 创建:

  • 创建一个新对象,其原型为 Object.prototype
  • 创建一个空对象,其行为与字面量创建的对象相同。

6. 性能差异

一般情况下,字面量创建 的性能优于 Object.create() 创建new Object() 创建

结论

综上所述,字面量创建、Object.create() 和 new Object() 创建对象的方式各有千秋,具体使用场景取决于具体需求。

  • 字面量创建: 适用于创建临时对象或具有自定义原型的对象。
  • Object.create() 创建: 适用于创建具有特定原型的对象。
  • new Object() 创建: 适用于创建具有 Object.prototype 原型的对象,其行为与字面量创建的对象类似。

掌握这三种创建对象的方式,可以帮助我们更加灵活高效地编写代码。