上一章回顧了JS對象的屬性類型,那麼除了咱們經常使用的new Object()
構造函數建立對象和字面量方式建立對象的方式外,還須要用到更多的模式來解決對象被屢次複用的問題。什麼意思呢?就是咱們頗有可能會在各個地方去使用已經建立過的對象,可是對象裏的屬性值有多是不一樣的。舉個例子:設計模式
let obj = { name:"勾鑫宇", age:18, myName:function(){ console.log(this.name) } }
若是咱們想繼續使用這個obj對象,但裏面的屬性值須要改變,咱們可能會想到這樣作:函數
let obj2 = obj; obj2.name = "張三";
可是這樣作有一個問題,因爲JS中引用類型的機制,當你修改obj2
的同時,obj
也被改變了。因此咱們就不得不像下面這樣再從新建立一個obj2
對象。網站
let obj2 = { name:"張三", age:23, myName:function(){ console.log(this.name) } }
這樣就無形中給咱們增長了不少工做,代碼量也會大大增長,而這麼多重複的東西是徹底不必的。因而咱們就須要用到建立對象的各類設計模式來解決這個問題了,這章先講工廠模式。this
根據書上和各類百科的解釋,仍是先來一個官方版本,而後寫寫個人理解吧。設計
官方解釋:
工廠是構造方法的抽象,抽象了建立具體對象的過程。工廠方法模式的實質是「定義一個建立對象的接口,但讓實現這個接口的類來決定實例化哪一個類。工廠方法讓類的實例化推遲到子類中進行。code
工廠模式分爲三類:簡單工廠模式、工廠方法模式和抽象工廠模式對象
個人理解:
至於爲何要叫工廠模式,就是由於這個模式將咱們所須要的邏輯代碼給封裝到了一個函數裏面,而後咱們只須要傳入相應的參數,就可以去獲取須要的結果。這個過程就如同咱們向工廠要東西同樣簡單。好比咱們須要一臺電腦,只須要告訴工廠電腦的屏幕尺寸是多大、系統是Win仍是Linux、內存是多少G,而不用關心屏幕是怎麼製做的,系統是怎麼設置的,內存條是怎麼作的,最重要的是最終這個電腦是怎麼組裝出來的咱們也不關心,只關心最後能拿到一臺咱們所需的成品電腦就好了。接口
因爲《JS高編》裏這一部分只講了簡單工廠模式的實現,其餘兩種模式就先不說,更多的能夠去看《JS設計模式》。內存
//建立一個簡單函數,就看成一個類 //第一種方式是經過new Object()建立對象,最後返回它 function person(name,age){ let o = new Object(); o.name = name; o.age = age; o.myName = function(){ console.log("個人名字是"+o.name) } return o; } let person1 = person("勾鑫宇",18); let person2 = person("張三",23); person1.myName();//輸出「個人名字是勾鑫宇」 person2.age;//輸出23 //第二種方式是經過字面量形式建立對象 function person(name,age){ let o = { name: name; age: age; myName: function(){ console.log("個人名字是"+o.name) } } return o; }
上面的方法使用簡單工廠模式封裝了一個類,而後咱們只須要傳入名字和年齡的參數就好了。那麼咱們還能夠添加稍微複雜一點的邏輯在這個工廠裏面。產品
function person(name,age,country){ let o = { name: name, age:age, myName:function(){ console.log("個人名字是" + o.name) }, country:country, type:'' } if(age > 18 && country !== 'China'){ o.type = "成年人"; console.log('容許進入該網站') } else if(age < 18 ){ o.type = "未成年"; console.log('不容許進入該網站') } else { o.type = "成年人"; console.log('不容許進入該網站') } return o } let person1 = person("李四",20,"Japan");//輸出「容許進入該網站」 let person2 = person("張三",17,"Japan");//輸出「不容許進入該網站」 let person3 = person("王五",23,"China");//輸出「不容許進入該網站」
簡單工廠模式的優勢很明顯,就是將咱們的邏輯代碼都封裝好了,最終只暴露出一個公共的接口讓咱們傳入參數便可使用。這種方式極大地減小了代碼量,提升了代碼的複用性。同時使得咱們可以根據不一樣的條件去創造不一樣的工廠,最終得到不一樣的產品。
這種模式的缺點也是很明顯的,由於咱們複雜的邏輯都封裝在了函數裏,一旦某處出現了邏輯錯誤,就會影響全部使用這個工廠的人,能夠說是牽一髮而動全身。