什么是构造函数? 构造函数和工厂函数一样,都是用来创建对象的,从本质上可以看作 是工厂函数的简写
构造函数和工厂函数的区别 1. 工厂函数可以直接调用,而构造函数需要用new来调用 2. 工厂函数的名称大小写随意,而构造函数要求首字母必须大写
构造函数格式:
在构造函数中,this谁调用就是谁 如果有两次调用,如下图所示:
这时候obj1和obj2的地址是不同的,他们的内存分配如图所示:
这时候就带来了一个性能问题,既然里面say方法的实现都是一样的,但是被分配到了不同的 存储空间,造成性能浪费,所以就有了构造函数的优化
构造函数的优化: 既然他们调用的say是同一个方法,那么我们可以在构造函数外面定义一个mysay(随意起名)函数,然后在构造函数内部直接定义一个函数指向mysay,也就是直接将mysay的地址赋给构造函数内部的say,也就是说当前构造函数内的say存储的不是一个方法,而是一个指向mysay的地址,这样就不容易造成资源浪费,如图所示:
还有一种更为简便的办法 每个构造函数都有一个默认属性:prototype prototype属性可以在构造函数外面为构造函数添加新的属性,并且 可以解决资源浪费以及占用命名的问题 如图所示:
当我们用prototype给构造函数添加属性或者方法的时候,Person.prototype原本所 指向的的原型对象被我们新定义的函数所覆盖,其中的constructor属性的指向就发生 了改变,从Person变成了object,所以为了不改变它的指向,在使用prototype给构造 函数添加属性或者方法的时候,要将constructor的指向定义为Person,否则会破坏原有 的结构关系