1,构造函数是干嘛的?
构造函数是为了创建对象的,有的人会问,那我们用简单的用字面量就可以创建对象了嘛,例:( var obj = {} ),为啥还要用构造函数呢?
我们举个例子:简单创建一些"人"的对象,有姓名,年龄等属性,有吃,睡等方法
![5d5bf3d7922d05da7a12dd8363c90762.png](https://i-blog.csdnimg.cn/blog_migrate/87c1835a5452ef4da6f19f18771bcc2d.jpeg)
我们发现这些对象都有共性,属性名字一样的,方法都是一样的,这样能不能写一个通用的生成这些对象模板呢?
遇到上述情况我们就需要使用我们的构造函数了,构造函数实际上也是对象的模板,他相当于在你创建对象的时候,给这些对象一些通用属性和方法。
2,构造函数和普通函数的区别
普通函数是函数名后面加个括号调用的,而构造函数是new关键字后面跟上函数名和括号调用
例:
![fcc8b4b4a681177c2c26f28b29c2da9a.png](https://i-blog.csdnimg.cn/blog_migrate/1586b8ff45cf15a69fc3bba2a70860d6.jpeg)
这样我们就实现了普通函数和构造函数的调用,上述函数是同一个函数a,我们既能把它当做普通函数,又能把它当做构造函数,可见:是不是构造函数主要在于new,使用new调用的就是构造函数。
同样的我们看到a函数我们没有return,直接调用时返回值为undefined,而构造函数是返回了一个空对象(前面带个小a,代表是由a构造函数创建出来的)。
根据规范:我们构造函数首字母一般要大写。
3,new做了什么?
主要分四步:
1)创建一个新的空对象
2)让构造函数中的this指向这个空对象
3)执行构造函数里面的代码,为实例对象添加属性和方法
4)返回新对象
首先我们先记住这几点,然后尝试在构造函数中使用this
![2cb91eb03c392086cba6fb11767c34ad.png](https://i-blog.csdnimg.cn/blog_migrate/9f698016657c146b1c5ca8b3bafcbcc0.jpeg)
A作为构造函数时,里面this指向了返回的新对象。
A作为普通函数时,里面this指向了外层对象window
我们给返回的对象添加属性
![a6452ef97379321c0704a734a57ab624.png](https://i-blog.csdnimg.cn/blog_migrate/9a569000402e6756f81c56a4cc5fad35.jpeg)
我们给这个函数传参
![67a615411b65acc1b9ae6eb601d5532e.png](https://i-blog.csdnimg.cn/blog_migrate/33c5bba3b64e6e662f9628f92d1c92af.jpeg)
根据上面四步,先创建了个空对象,然后this指向它,然后执行A里面的逻辑代码,然后把这个对象返回,这个步骤也叫作实例化
假如构造函数A里面有返回值,返回值如果是个对象,则this指向这个对象,如果是个值,则不起作用(我们了解下就行了,一般不要return)
这样我们就可以创建一些“人“的对象
![d9fe0b0df3b451fe876c61e4deba651f.png](https://i-blog.csdnimg.cn/blog_migrate/173c875b05a91811c5d92efd5d7b038c.jpeg)
![d409e67ec072d2231ce37c5ba4afb942.png](https://i-blog.csdnimg.cn/blog_migrate/ae65899f48d07811c1bdf39455b234b6.jpeg)
Person构造函数相当于对象模板,new把模板转化成一个对象实例。
实际上var obj = {} 也是 var obj = new Object()的语法糖。