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