网站

JavaScript 对象创建 - W3School

构造函数 - JavaScript | MDN

引入

学了 JS 对象 之后,知道可以用 {} 创建一个对象。但如果要创建多个结构相同的对象,每次都手写一遍太麻烦。

JS 提供了几种方式来批量创建相似的对象:对象字面量、构造函数和 class

正文

定义

定义

自定义对象是用代码自己创建的对象,区别于 JS 内置的 ObjectArray 等对象。可以用对象字面量、构造函数或 class 来创建。

对象字面量

适合创建单个、独一无二的对象。

let user1 = {
  name: "Tom",
  age: 18,
  sayHello() {
    console.log("你好,我是" + this.name);
  }
};
 
let user2 = {
  name: "Jack",
  age: 20,
  sayHello() {
    console.log("你好,我是" + this.name);
  }
};

每个对象都要单独写一遍,代码重复度高。

构造函数

构造函数是一个普通函数,用 new 调用时可以创建对象。

function User(name, age) {
  this.name = name;
  this.age = age;
  this.sayHello = function () {
    console.log("你好,我是" + this.name);
  };
}
 
let user1 = new User("Tom", 18);
let user2 = new User("Jack", 20);
 
user1.sayHello();
user2.sayHello();

构造函数名通常首字母大写,用来和普通函数区分。

new 做了这几件事:

  1. 创建一个空对象
  2. this 指向这个空对象
  3. 执行构造函数里的代码
  4. 返回这个新对象

方法放到原型上

如果把方法写在构造函数里,每次 new 都会创建一份新的函数。

更好的做法是把方法放到 prototype 上。

function User(name, age) {
  this.name = name;
  this.age = age;
}
 
User.prototype.sayHello = function () {
  console.log("你好,我是" + this.name);
};
 
let user1 = new User("Tom", 18);
let user2 = new User("Jack", 20);
 
user1.sayHello();
user2.sayHello();

这样所有实例共享同一个方法,更省内存。

class 语法

ES6 引入了 class,是构造函数的更清晰写法。

class User {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
 
  sayHello() {
    console.log("你好,我是" + this.name);
  }
}
 
let user1 = new User("Tom", 18);
let user2 = new User("Jack", 20);
 
user1.sayHello();
user2.sayHello();

constructor 是构造函数,new 时自动调用。

写在 class 里面的方法,会自动放到原型上,不需要手动操作 prototype

三种方式对比

特性对象字面量构造函数class
适合场景创建单个对象创建多个相似对象创建多个相似对象
语法简洁度直观一般最清晰
方法共享每个对象独立需要手动放 prototype自动放原型
继承写法不支持需要手动设置原型链extends 关键字
ES 版本ES3ES3ES6

什么时候用哪种

  • 只需要一个对象 → 对象字面量
  • 需要创建多个相似对象 → class(推荐)或构造函数
  • 老项目可能还在用构造函数,需要能看懂

特点

  • 对象字面量最简单,但不适合批量创建
  • 构造函数配合 prototype 可以实现方法共享
  • class 是构造函数的语法糖,底层原理一样
  • 构造函数名首字母大写是约定
  • new 关键字用来调用构造函数

理解

可以把这三种方式理解为造房子的不同方法

对象字面量就像手工盖一间房子,盖完一间再盖下一间,每间都要从头来。

构造函数就像有了一张图纸,每次按图纸盖,都能盖出结构一样的房子。

class 就是图纸的升级版,画法更清楚,还能在大图纸上画小图纸(继承)。

实际开发中,如果只需要一个对象,直接用字面量。如果需要创建很多相似对象,优先用 class

引出

理解了自定义对象的创建方式后,可以继续学习 JS 原型和原型链,了解对象背后的继承机制。

也可以直接学习 JS 类,深入了解 class 的继承和其他用法。

如果想了解 JS 提供了哪些可以直接用的内置对象,可以看看 JS 常用对象