- 本质
- 函数是对象
- 构造函数也是函数,本质也是对象
- 用途
- 构造函数用于创建新对象
- 函数(普通函数)用于执行某些操作,可能会接收参数,并返回一个值
- 命名
- 构造函数名通常首字母大写
- 普通函数名通常首字母小写
new
- 构造函数调用时会用到
new
关键字 - 普通函数调用无需使用
new
关键字
- 构造函数调用时会用到
this
的指向- 在普通函数中,
this
的值取决于如何调用函数 - 在构造函数中,
this
总是引用新创建的对象实例
- 在普通函数中,
- 返回值
- 构造函数通常不返回值(或者说,它们返回
this
,即新创建的对象) - 普通函数可以返回任何类型的值
- 构造函数通常不返回值(或者说,它们返回
JS 中的函数,无非就是两种:
- 普通函数
- 构造函数
构造函数这个概念是在某些编程语言中出现的,但并不是所有编程语言都有。不同的编程语言有不同的对象创建和初始化机制。如果你了解面向对象,那么可以将“构造函数”视作“类”,因为它们的用途是类似的,都是用于创建实例的。这篇文档主要介绍构造函数、函数,之间的一些差异,目标在于搞清楚什么是构造函数,什么是函数。
函数
函数的本质就是对象。所有的对象,本质上都是通过构造函数来创建出来的。既然函数本质上就是一个对象,那么,函数也必然是通过构造函数来创建出来的,而创建函数的构造函数,就是 Function。即:所有的函数,都是通过 new Function(...);
的方式来创建的 Function 实例。
由于函数本身就是对象,因此函数中,也可以拥有各种属性。比如:
f.length
表示函数定义时期望接收的参数的数量f.name
返回函数的名称- ……
尽管函数是对象,但它们与普通对象有所不同,因为它们可以被调用。这是因为函数对象有一个内部的 [[Call]]
方法,允许它被执行。
构造函数
构造函数也是函数,它本质上也是一个对象。但是构造函数和函数的用途和调用方式上存在些许差异。
对比“函数”和“构造函数”
在 JS 中,任何函数都可以作为构造函数,但并非所有函数都是作为构造函数来设计的。函数和构造函数之间的主要区别在于它们的用途和如何调用它们。
函数(普通函数)
- 目的:执行某些操作,可能会接收参数,并返回一个值。
- 调用:直接使用函数名称,后跟参数列表。
function add(x, y) {
return x + y;
}
const result = add(3, 4);
构造函数
- 目的:初始化一个新对象,设置对象的属性和行为。
- 调用:使用
new
关键字调用函数。
function Person(name, age) {
this.name = name;
this.age = age;
}
const alice = new Person('Alice', 30);
- 当使用
new
关键字调用函数时,以下事情发生:- 创建一个空对象。
- 将这个空对象的原型设置为构造函数的
prototype
。 - 使用这个新对象作为
this
上下文调用构造函数。 - 如果构造函数没有返回其它对象,则默认返回这个新对象。
- 通常,构造函数的名称首字母大写(如
Person
),而普通函数则不是。这是一种命名约定,用于区分它们。
注意事项
this
的指向- 在普通函数中,
this
的值取决于如何调用函数(例如,作为对象的方法、普通函数调用、箭头函数等) - 在构造函数中,
this
总是引用新创建的对象实例
- 在普通函数中,
- 返回值
- 构造函数通常不返回值(或者说,它们返回
this
,即新创建的对象) - 普通函数可以返回任何类型的值
- 构造函数通常不返回值(或者说,它们返回
总的来说,尽管技术上任何函数都可以使用new
关键字调用,但只有特定设计为构造函数的函数才应该这样使用。这是为了确保对象的正确初始化和属性/方法的正确设置。