霍州ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
工廠模式
1 function createPerson(name,age,job){ 2 var o = new Object(); 3 o.name = name; 4 o.age = age; 5 o.job = job; 6 o.sayName = function(){ 7 console.log(this.name); 8 } 9 return o;10 }11 12 var person1 = createPerson("Nicholas",29,"SoftWare Engineer");13 var person2 = createPerson("Greg",23,"Doctor");
工廠模式雖然解決了創(chuàng)建多個(gè)相似對(duì)象的問題,但卻沒有解決對(duì)象識(shí)別的問題(即怎么樣知道一個(gè)對(duì)象的類型)
構(gòu)造函數(shù)模式
1 function Person(name,age,job){ 2 this.name = name; 3 this.age = age; 4 this.job = job; 5 this.sayName = function(){ 6 console.log(this.name); 7 }; 8 } 9 10 var person1 = new Person("Nicholas",29,"SoftWare Engineer");11 var person2 = new Person("Greg",23,"Doctor");
Person()中的代碼除了與createPerson()中相同的部分外,還存在以下不同之處:
1、沒有顯示的創(chuàng)建的對(duì)象
2、直接將屬性和方法賦給了this對(duì)象
3、沒有return語句
按照慣例,構(gòu)造函數(shù)始終都應(yīng)該以一個(gè)大寫字母開頭,而非構(gòu)造函數(shù)則應(yīng)該以一個(gè)小寫字母開頭。
要?jiǎng)?chuàng)建Person的新實(shí)例,必須使用new操作符。以這種方式調(diào)用的構(gòu)造函數(shù)實(shí)際上會(huì)經(jīng)歷一下4個(gè)步驟
1、創(chuàng)建一個(gè)新對(duì)象
2、將構(gòu)造函數(shù)的作用域賦給新對(duì)象
3、執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對(duì)象添加屬性)
4、返回新對(duì)象
person1和person2分別保存著Person的一個(gè)不同的實(shí)例。這兩個(gè)對(duì)象都有一個(gè)constructor(構(gòu)造
函數(shù))屬性,該屬性指向Person
1 alert(person1.constructor == Person); //true2 alert(person2.constructor == Person); //true
但是,提到檢測(cè)對(duì)象的類型,還是instanceof操作符更可靠一些,上面的例子中創(chuàng)建的所有對(duì)象即是
Object的實(shí)例,也是Person的實(shí)例。
1 console.log(person1 instanceof Object); //true2 console.log(person1 instanceof Person); //true
創(chuàng)建自定義的構(gòu)造函數(shù)一意味著將來可以將它實(shí)例標(biāo)識(shí)為一種特定的類型;而這正是構(gòu)造函數(shù)模式
勝過工廠模式的地方。
1、將構(gòu)造函數(shù)當(dāng)做函數(shù)
構(gòu)造函數(shù)與其他函數(shù)的唯一區(qū)別,就在于調(diào)用他們的方式不同。任何函數(shù),只要通過new操作符來調(diào)用,
那他就可以作為構(gòu)造函數(shù),而任何函數(shù)如果不通過new操作符來調(diào)用,那他和普通函數(shù)沒什么差別
1 //當(dāng)做構(gòu)造函數(shù)使用 2 var person = new Person("Nicholas",29,"Software Engineer"); 3 person.sayName(); //Nicholas 4 5 //作為普通函數(shù)調(diào)用 6 Person("Greg",27,"Doctor"); 7 window.sayName(); //Greg 8 9 //在另一個(gè)對(duì)象的作用域中調(diào)用10 var o = new Object();11 Person.call(o,"Kristen",25,"Nurse");12 o.sayName(); //Kristen
2、構(gòu)造函數(shù)的問題
構(gòu)造函數(shù)的主要問題就是每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍,person1和person2都有一個(gè)名為
sayName()的方法,但那兩個(gè)方法不是同一個(gè)Function實(shí)例
1 console.log(person1.sayName == person2.sayName); //false
為了解決這個(gè)問題,通常將函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外面
1 function Person(name,age,job){ 2 this.name = name; 3 this.age = age; 4 this.job = job; 5 this.sayName = sayName; 6 } 7 8 function sayName(){ 9 console.log(this.name);10 } 11 12 var person1 = new Person("Nicholas",29,"SoftWare Engineer");13 var person2 = new Person("Greg",23,"Doctor");
這樣一來就又出現(xiàn)了新的問題,在全局作用域中定義的函數(shù)sayName()只能被某個(gè)對(duì)象調(diào)用,這讓全局作用域有點(diǎn)名不副實(shí)。更加嚴(yán)重的是,如果對(duì)象需要定義很多方法,那么就要定義很多個(gè)全局函數(shù),于是我們這個(gè)自定義的引用類型就絲毫沒有封裝性可言了,這些問題都可以通過原型模式來解決