目录

💾 JavaScript 对象构造器

常规的 {...} 语法允许创建一个对象。但是在需要创建很多类似的对象,例如多个用户或菜单项等。这可以使用构造函数和 "new" 操作符来实现。

# 构造函数

构造函数在技术上是常规函数。不过有两个约定:

  1. 命名以大写字母开头。
  2. 只能由 new 操作符来执行。

🌰 例子:

function User(name) {
  // this = {} (隐式创建对象) 
  this.name = name;
  this.isAdmin = false;
	
  // return this (隐式返回对象)
}

let user = new User("Jack");

alert(user.name); // Jack
alert(user.isAdmin); // false
1
2
3
4
5
6
7
8
9
10
11
12

当一个函数被使用 new 操作符执行时,它按照以下步骤:

  1. 一个新的空对象被创建并分配给 this
  2. 函数体执行。通常它会修改 this ,为其添加新的属性。
  3. 返回 this 的值。

使用构造器实现可重用的对象创建代码。任何函数(除了箭头函数,它没有自己的 this )都可以用作构造器。即可以通过 new 来运行,它会执行上面的算法。「首字母大写」是一个共同的约定,以明确表示一个函数将被使用 new 来运行。

当无参构造时,括号可以省略,例如: let user = new User 。但是省略括号不是一种好的代码风格,影响代码可读性。

关于 new function() :如果有许多行用于创建单个复杂对象的代码,可以将它们封装在一个立即调用的构造函数中:

let user = new function() {
  this.name = 'Simon'
  this.isAdmin = false
}
1
2
3
4

这个构造函数不能被再次调用,因为它不保存在任何地方,只是被创建和调用。因此,这个技巧旨在封装构建单个对象的代码,而无需将来重用。

# 构造器的 return

通常,构造器没有 return 语句,它们的任务是将所有必要的东西写入 this ,并自动转换为结果。

但是,如果这有一个 return 语句,那么规则就简单了:

  • 如果 return 返回的是一个对象,则返回这个对象,而不是 this (会覆盖掉原来返回的 this )。🌰 例如:

    function BigUser() {
      this.name = "John";
      return { name: "Godzilla" };  // <-- 返回这个对象
    }
    
    alert( new BigUser().name ); 
    
    1
    2
    3
    4
    5
    6
  • 如果 return 返回的是一个原始类型,则忽略。例如:

    function SmallUser() {
      this.name = "John";
      return; // <-- 返回 this
    }
    
    1
    2
    3
    4

提示

通常构造器中不会有 return 语句。 return 返回对象是特殊行为。

# 构造器中的方法

🌰 例子:

function User(name) {
  this.name = name;

  this.sayHi = function() {
    alert( "My name is: " + this.name );
  };
}

let simon = new User('Simon')
simon.sayHi()
1
2
3
4
5
6
7
8
9
10

# 构造器总结

  • 构造函数为创建对象带来灵活性。构造函数的参数,定义了如何构造对象以及要在对象放入什么。
  • 构造函数只能使用 new 来调用。这样调用意味着开始创建了空 this ,最后返回了填充了值的 this .
  • JavaScript 还为许多内建对象提供了构造函数,比如 日期 Date 、集合 Set
📢 上次更新: 2022/09/02, 10:18:16