- 本质
- 函数是对象
- 构造函数也是函数,本质也是对象
- 用途
- 构造函数用于创建新对象
- 函数(普通函数)用于执行某些操作,可能会接收参数,并返回一个值
- 命名
- 构造函数名通常首字母大写
- 普通函数名通常首字母小写
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关键字调用,但只有特定设计为构造函数的函数才应该这样使用。这是为了确保对象的正确初始化和属性/方法的正确设置。
