1. 本质
    1. 函数是对象
    2. 构造函数也是函数,本质也是对象
  2. 用途
    1. 构造函数用于创建新对象
    2. 函数(普通函数)用于执行某些操作,可能会接收参数,并返回一个值
  3. 命名
    1. 构造函数名通常首字母大写
    2. 普通函数名通常首字母小写
  4. new
    1. 构造函数调用时会用到 new 关键字
    2. 普通函数调用无需使用 new 关键字
  5. this的指向
    1. 在普通函数中,this的值取决于如何调用函数
    2. 在构造函数中,this总是引用新创建的对象实例
  6. 返回值
    1. 构造函数通常不返回值(或者说,它们返回this,即新创建的对象)
    2. 普通函数可以返回任何类型的值

JS 中的函数,无非就是两种:

  1. 普通函数
  2. 构造函数

构造函数这个概念是在某些编程语言中出现的,但并不是所有编程语言都有。不同的编程语言有不同的对象创建和初始化机制。如果你了解面向对象,那么可以将“构造函数”视作“类”,因为它们的用途是类似的,都是用于创建实例的。这篇文档主要介绍构造函数、函数,之间的一些差异,目标在于搞清楚什么是构造函数,什么是函数。

函数

函数的本质就是对象。所有的对象,本质上都是通过构造函数来创建出来的。既然函数本质上就是一个对象,那么,函数也必然是通过构造函数来创建出来的,而创建函数的构造函数,就是 Function。即:所有的函数,都是通过 new Function(...); 的方式来创建的 Function 实例。

由于函数本身就是对象,因此函数中,也可以拥有各种属性。比如:

  • f.length 表示函数定义时期望接收的参数的数量
  • f.name 返回函数的名称
  • ……

尽管函数是对象,但它们与普通对象有所不同,因为它们可以被调用。这是因为函数对象有一个内部的 [[Call]] 方法,允许它被执行。

构造函数

构造函数也是函数,它本质上也是一个对象。但是构造函数和函数的用途和调用方式上存在些许差异。

对比“函数”和“构造函数”

在 JS 中,任何函数都可以作为构造函数,但并非所有函数都是作为构造函数来设计的。函数和构造函数之间的主要区别在于它们的用途和如何调用它们。

函数(普通函数)

  • 目的:执行某些操作,可能会接收参数,并返回一个值。
  • 调用:直接使用函数名称,后跟参数列表。
  1. function add(x, y) {
  2. return x + y;
  3. }
  4. const result = add(3, 4);

构造函数

  • 目的:初始化一个新对象,设置对象的属性和行为。
  • 调用:使用 new 关键字调用函数。
  1. function Person(name, age) {
  2. this.name = name;
  3. this.age = age;
  4. }
  5. const alice = new Person('Alice', 30);
  • 当使用 new 关键字调用函数时,以下事情发生:
    1. 创建一个空对象。
    2. 将这个空对象的原型设置为构造函数的 prototype
    3. 使用这个新对象作为 this 上下文调用构造函数。
    4. 如果构造函数没有返回其它对象,则默认返回这个新对象。
  • 通常,构造函数的名称首字母大写(如Person),而普通函数则不是。这是一种命名约定,用于区分它们。

注意事项

  1. this的指向
    1. 在普通函数中,this的值取决于如何调用函数(例如,作为对象的方法、普通函数调用、箭头函数等)
    2. 在构造函数中,this总是引用新创建的对象实例
  2. 返回值
    1. 构造函数通常不返回值(或者说,它们返回this,即新创建的对象)
    2. 普通函数可以返回任何类型的值

总的来说,尽管技术上任何函数都可以使用new关键字调用,但只有特定设计为构造函数的函数才应该这样使用。这是为了确保对象的正确初始化和属性/方法的正确设置。