学习笔记——JavaScript创建对象的方式及其区别

31 阅读1分钟

嗯,学习归学习,除了coding的时候用到一些, 终究还是要对付面试的,哈哈哈哈。。。。

1. 对象字面量

最简单直接的方式,使用大括号 {} 创建对象:

const person = {
  name: '张三',
  age: 25,
  sayHello: function() {
    return `你好,我是${this.name}`;
  }
};

2. Object构造函数

使用内置的Object构造函数:

const person = new Object();
person.name = '李四';
person.age = 30;
person.sayHello = function() {
  return `你好,我是${this.name}`;
};

3. 构造函数模式

使用自定义构造函数创建多个相似对象:

function Person(name, age) {
  this.name = name;
  this.age = age;
  this.sayHello = function() {
    return `你好,我是${this.name}`;
  };
}

const person1 = new Person('王五', 28);
const person2 = new Person('赵六', 32);

4. 工厂模式

通过函数封装对象创建过程:

function createPerson(name, age) {
  return {
    name,
    age,
    sayHello() {
      return `你好,我是${this.name}`;
    }
  };
}

const person = createPerson('钱七', 26);

5. 原型模式

利用原型链实现属性和方法的共享:

function Person() {}
Person.prototype.name = '默认姓名';
Person.prototype.age = 0;
Person.prototype.sayHello = function() {
  return `你好,我是${this.name}`;
};

const person1 = new Person();
const person2 = new Person();

6. 组合模式(构造函数+原型)

最常用的模式,结合了构造函数和原型的优点:

function Person(name, age) {
  // 实例属性
  this.name = name;
  this.age = age;
}

// 共享方法
Person.prototype.sayHello = function() {
  return `你好,我是${this.name}`;
};

  1. 类语法(ES6) 使用class关键字,语法更清晰:
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  
  sayHello() {
    return `你好,我是${this.name}`;
  }
}

const person = new Person('孙八', 29);

8. Object.create()

基于现有对象创建新对象:

const personProto = {
  sayHello: function() {
    return `你好,我是${this.name}`;
  }
};

const person = Object.create(personProto);
person.name = '周九';
person.age = 27;

各种方式的区别对比

image.png

关键区别点

  1. 内存使用‌:原型模式和类语法的方法在原型上共享,节省内存
  2. 继承机制‌:构造函数、原型模式、类语法支持完整的原型继承
  3. this绑定‌:箭头函数和普通函数在对象方法中的this指向不同
  4. 属性特性‌:Object.defineProperty()可以定义属性的可枚举、可配置、可写特性
  5. 性能考虑‌:对于需要创建大量实例的场景,组合模式和类语法是最佳选择

实际应用建议

  • 简单配置对象‌:使用对象字面量
  • 需要多个相似实例‌:使用类语法或组合模式
  • 需要复杂的继承关系‌:使用类语法
  • 需要动态原型‌:使用Object.create()
  • 现代项目开发‌:优先选择ES6类语法