构造函数
# 前言
在JavaScript
语言的对象体系中,是基于构造函数(constructor)
和原型链(prototype)
。
# 对象的概念
"面对对象编程"(Object Oriented Programming,
缩写为OOP )
是目前主流的变成范式,它的核心思想是将真实世界中各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。
a:
对象是单个实物的抽象。
b:
对象是一个容器,封装了属性和方法
一本书、一辆汽车、一个人都可以是'对象'。当实物被抽象成'对象',实物之间的关系就变成了'对象'之间的关系,从而就可以模拟现实情况,针对'对象'进行编程。
所谓属性,就是对象的一种状态;所谓方法,就是对象的一种行为。
# 构造函数
‘面向对象编程’的第一步,就是要生成对象。而js
中面向编程是基于构造函数(constructor)
和原型链(prototype)
的。
“对象”是单个实物的抽象。通常需要一个模板,表示某一类实物的共同特征,然后“对象”根据这个模板生成。
js
语言中使用构造函数(constructor)
作为对象的模板。所谓构造函数,就是根据提供一个生成对象的模板,并根据对象的基本结构的函数。一个构造函数,可以生成多个对象,每个对象都有相同的结构。
看一下构造函数的基本结构:
let Keith = function () {
this.height = 180;
};
// 两种写法
function Keith () {
this.height = 180;
};
2
3
4
5
6
7
在此代码块中,Keith
就是构造函数,它提供模板,用来生成对象实例。为了与普通函数的区别,构造函数的名字的第一个字母通常大写。
构造函数的三大特点:
- 构造函数的函数名第一个字母通常大写。
- 函数体内使用
this
关键字,代表所要生成的对象实例。- 生成对象的时候,必须使用
new
命令来调用构造函数。
# new
命令
# 基本原理
new
命令的作用,就是执行一个构造函数,并且返回一个对象实例。使用new
命令时,它后面的函数调用就不是正常调用,而是依次执行下面的步骤:
- 创建一个空对象作为将要返回的对象实例;
- 将空对象的原型指向了构造函数的
prototype
属性; - 将空对象赋值给构造函数内部的
this
关键字; - 开始执行构造函数内部的代码;
也就是说,构造函数内部,this
指向的是一个新生成的空对象,所有针对this
的操作,都会发生在这个空对象上。构造函数之所谓构造函数,意思是这个函数的目的就是操作一个空对象(即this
对象),将其构造为需要的样子。
# 基本用法
new
命令的作用,就是调用一个构造函数,并返回一个对象实例。
function Keight () {
this.height = 180;
};
let boy = new Keight();
console.log(boy.height); // 180
2
3
4
5
此代码通过new
命令,让构造函数Keight
生成一个对象实例,并赋值给全局变量boy
。这个新生成的对象实例,从构造函数Keight
中继承了height
属性。也就说明这个对象实例是没有height
属性的。在new
命令执行时,就代表了新生成的对象实例boy
。this.height
代表对象实例有一个height
属性,值是180。
使用new
命令时,根据需要,构造函数也可以接受参数。
当使用new
来调用构造函数时,new
命令会创建一个空对象boy
,作为将要返回的实例对象。接着,这个空对象的原型会只想构造函数的prototype
属性,也就是boy.prototype === Keight.prototype
的。需要注意的是空对象指向构造函数Keight
的prototype
属性,而不是指向构造函数本身。然后,将这个空对象赋值给构造函数内部的this
的关键字,也就是说,让构造函数内部的this
关键字指向一个对象实例。最后,开始执行构造函数内部代码。
构造函数是生成对象的函数,是给对象提供模板的函数。
function Keight () {
this.height = 180;
};
let boy = Keight();
console.log(boy.height); // TypeError: height is undefined
2
3
4
5
new
命令创建空对象,总是返回一个对象,要么是实例对象,要么是return
语句指定的**对象或数组*/*(字符串会被忽略)