构造函数是什么,查看网上的讲解,大多数介绍的是为方便快速建立对象所设定的,跟原生函数并无多大区别,可是这只是浅显的介绍,构造函数是如何快速的构建新对象和原理如何,以及其中的this指向,这些问题,我们今天来一一解决:
1.目的
构造函数是干什么的?方便快速建立对象,又如何快速建立了对象?别急,我们通过个例子来详细看一看,
打个比方,现在有个业务需求,要求建立全班同学的一个对象表,怎么办?可能你的第一想法是每个人建立对象类型并且在当中添加键值对,这当然是正确的,我们来看看代码:
let p1 = {
age:20,
name:"zhangsan",
sex:"man"
}
let p2 = {
age:20,
name:"lisi",
sex:"man"
}
let p3 = {
age:20,
name:"wangwu",
sex:"woman"
}
let p4 = {
age:20,
name:"liliu",
sex:"man"
}
我们可以发现我们重复的写了代码,比如age,name,和sex,这个时候,就需要我们的构造函数出马了。
构造函数在技术上是常规函数。不过有两个约定:
1.它们的命名以大写字母开头。
2.它们只能由 “new” 操作符来执行
注意第二个要求,因为第一个要求只是默认的而不是强制,如果你看到了首字母大写的函数并不代表它一定是构造函数,但是如果你看见一个函数被new所调用,那它一定是构造函数
我们来看看如何使用构造函数来让这个问题变得简单
function Username(age,name,sex) {
this.age = age;
this.name = name;
this.sex = sex;
}
let p1 = new Username(20,"zhangsan","man")
上面那个Username()就是构造函数,底下通过new 调用了这个函数,简单来看就是通过这个函数为声明的p1自动建立了一个对象并为其添加参数内的数据,这么说还是有些笼统我们从构造函数内部来看看这个流程:
function Username(age, name, sex) {
// this = {};(隐式创建)
// 添加属性到 this
this.age = age;
this.name = name;
this.sex = sex;
// return this;(隐式返回)
}
let p1 = new Username(20, "zhangsan", "man")
我们添加了一些注释来解释这个流程,在我们创建构造函数时,先为this创建一个空的对象空间{},我们先将这里的this理解为一个具体的变量,但是并没有添加实际的值,注意这一步是隐式创建,我们在函数中是看不见这一步的,是js后台自动实现的,然后this.age = age 是什么意思,可能很多人都不理解,其实我们之前将this看成具体变量,这句话的意思很简单,就是为我们看做“变量”的this添加数据,具体的数据是什么,就是调用函数时所写的参数,我们再捋一遍,其实我们调用构造函数是函数内部所写的参数,就是this.age = age 右边的age,这点我们要特别注意,许多的讲解上并没有提到这一点,而这一点往往会让许多人困扰。
我们来接着看,之后函数隐式返回了this,怎么理解?很简单,跟普通函数一样,调用此函数时返回了一个完整的对象赋给p1,this此刻便指向p1,此时的p1即为
let p1 = {
age:20,
name:"zhangsan",
sex:"man"
}
是不是跟上面我们手动创建的对象相同,可是我们省去了许多重复的代码,这也是使用构造函数的初衷。