因爲網絡緣由,因此寫了一半就趕忙發了...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最重要的一個機制,原型
待續...