前面咱們一共介紹了四種方法用來封裝對象(工廠,構造模式,原型模式,構造+原型),而且重點對構造函數+原型模式作了一些改進,使之更加完美,那麼除了這幾種方法, 還有兩種方式用來封裝對象,仍是那句話,選擇適合本身的(其實每種方法都各有利弊,在我剛開始學習時總感受就是拆東牆補西牆)。數組
首先來看第一種方法安全
function Person(name,age){ var o=new Object(); o.name=name; o.age=age; o.sayName=function(){ console.log(this.name); }; return o; } var person_01=new Person("Sakura",22); var person_02=new Person("Misaka",20);
看到這我猜你多半在想大哥你蒙我呢?這不是工廠模式啊呸,這不是構造函數啊呸這是啥?app
這就是工廠模式+構造函數混合模式,有人把它叫寄生構造函數模式(mdzz)函數
首先咱們看到這種模式在本來構造函數的基礎上又增長了工廠模式,即在函數內部建立了一個新對象o,最後又返回出這個新對象o學習
書上講這種模式能夠在特殊狀況下用來爲對象建立構造函數,有一個例子this
function SpecArr(){ var values=new Array(); values.push.apply(values,arguments); values.toPopedString=function(){ return this.join("|"); } return values; } var colors=new SpecArr('red','blue','green'); console.log(colors.toPopedString()); //red|blue|green
這段代碼啥意思呢?spa
1.首先建立了一個構造函數SpecArrprototype
2.而後又在構造函數內部建立了一個數組對象code
3.又給這個數組對象利用apply對象冒充,再用方法添加了一些數組元素(調用時賦值)(因爲這裏構造函數並無指定參數個數,因此使用apply,傳入arguments對象)對象
4.而後給這個數組對象添加了一個方法,該方法的做用是使用「|」符號將數組合併爲一個字符串
5.最後返回這個對象
那麼說到底,當咱們須要爲某個原生對象添加自定義方法時,使用諸如Array.prototype.xxx不被容許,因此經過這種方法,能夠僅僅給經過這個構造函數實例化的內置對象添加一個私有的方法,該方法只對這個實例化的對象可見
var a=['456','fsdf','dasfgg']; a.toPopedString(); console.log(a); //error:Uncaught TypeError: a.toPopedString is not a function
因此其餘未經過這個構造函數實例化的數組對象沒法調用這個方法
須要注意的是使用這種方法建立出來的對象不能再用instanceof操做符來肯定對象的類型(固然這個例子中colors instanceof Array爲true,而colors instanceof SpecArr則爲false)
總的來講這種方法仍是儘可能少用,除非在以前四種方法沒法知足的狀況下再使用這種方法
第二種 (穩妥構造函數模式)
這種方法是著名的道格拉斯·克羅克福德(Douglas Crockford,蝴蝶書的做者)發明的
這種方法適合在一些安全的環境中,這種環境中可能會禁止使用this和new
穩妥構造函數模式與上面的寄生構造函數模式有點像,舉個栗子吧
function Person(name,age){ var o=new Object(); //這裏能夠再定義一些私有屬性和方法 o.sayName=function(){ console.log(name); } return o; }
var person_01=Person("Sakura",22);
person_01.sayName();
這樣建立的對象,你會發現沒有使用new關鍵字調用構造函數,而是直接調用了構造函數,因此person_01再用沒法直接調用它的屬性(name,age等),只有經過sayName才能訪問他的屬性,這使得它很是適合在某些安全執行環境中運行
好了,封裝對象的方法一共就這麼多(6種),反正都是各有利弊吧,最後兩種能夠權當了解,接下來將引入面向對象第二大特性
待續
...