因为网络缘由,因此写了一半就赶忙发了...javascript
书接上回前端
既然工厂模式建立的对象不属于任何类型,咱们知道JavaScript中其实是没有类(class)这个概念的,因此咱们须要建立一个伪类,这就用到了构造函数模式java
2.构造函数模式网络
所谓构造函数,就是将工厂模式改写一下,使用new关键字,模仿JavaScript内置对象的形式来建立对象函数
咱们知道JavaScript的内置对象(Array、Function等),建立时通常是 var aArr=new Array()的写法,且内置对象的首字母为大写,因此构造函数也应该遵循这个规定性能
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=function(){ console.log(this.name); } } //建立对象 var person_01=new Person("Sakura",22,"前端开发");
这里能够看到,所谓构造函数实际上也就是一个普通函数,不一样的是这个普通函数不能直接在全局做用域下调用,它仅仅用来建立对象this
构造函数与工厂模式的区别也很明显spa
1.构造函数内部并无显式的使用new Object建立对象,而是在使用new关键字调用时,函数内部自动初始化了一个对象设计
var obj=new Object
2.紧接着把构造函数的做用域赋值给了这个隐式的新对象(因此构造函数内部的this也不指向构造函数自己,而是指向了调用构造函数后的person_01对象)code
3.而后执行构造函数中的代码,为这个新对象建立属性
4.最后隐式的返回出了新对象
前面说到,构造函数本质上是模仿JavaScript的内置对象,因此首字母大写以及new关键字调用就很好的区分了构造函数与普通函数的区别
而此时再回到最初的问题,instanceof能告诉咱们什么?
console.log(person_01 instanceof Object); //true console.log(person_01 instanceof Person); //true
这个时候再用instanceof判断能够得知,新建立的person_01是Person类型的Object
使用构造函数建立对象,假如项目中有多个构造函数以及多个由不一样构造函数实例化的对象,那么此时不一样构造函数实例化的对象就从属于不一样的构造函数
紧接着咱们又有了新的问题
假如上面的Person构造函数实例化出了不少个对象,它们有不一样的属性,可是它们又有一个相同的sayName方法
var person_01=new Person("Sakura",22,"前端开发"); var person_02=new Person("Misaka",18,"网页设计"); //两个对象拥有一个彻底相同的方法sayName console.log(person_01.sayName==person_02.sayName);//false
为何会这样呢?
由于当咱们用构造函数实例化对象时,其实是把构造函数内部的sayName方法完彻底全复制给了新对象,此时每一个对象中的sayName方法都独占一块内存空间,也就是说它们并非同一个引用,这样在很大程度上又浪费了内存空间,下降了性能,因此咱们应该想到,将这个彻底相同的方法给每一个对象共享,使它们都指向同一个sayName,而不是独自拥有
这里就引入了JavaScript最重要的一个机制,原型
待续...