當一個項目的代碼量比較多,或者多人開發的時候,就須要引入一些設計模式來讓咱們更好的構建項目。不然代碼就會變得亂糟糟,像一團麪條同樣了。
講解設計模式比較好的書有:
一、設計模式
二、Head First設計模式編程
不過以上兩本書主要是關於靜態語言、面向對象的具體實現,由於靜態面嚮對象語言(好比C++ 和 Java)代碼寫法限制的是比較多的。不能給類動態的添加屬性、方法,函數的參數限制了類型等。設計模式
JS 雖然也是面向對象,可是同時支持函數式編程,函數自己是一種值能夠傳遞。JS的動態特性也不會限制變量類型。
因此Java 中的多態對JS 來講,那都不叫事。
對於 JS ,設計模式也應該更加靈活,不該該把靜態語言的設計模式生搬硬套到 JS 上,而應該根據語言特性靈活應用。
關於 JS 的設計模式,強力推薦這本書:JavaScript設計模式與開發實踐,來自騰訊的大牛所著。數組
講解設計模式以前,咱們先接觸一個重要的概念 鴨子類型
什麼叫鴨子類型呢?函數式編程
需求:若是咱們想聽鴨子的 嘎嘎嘎 叫聲 狀況:若是有一隻狗(不是鴨子),它也能發出 嘎嘎嘎 的叫聲。也就是說這條狗也能達到咱們的目的,那這條狗就是能夠用的。 思考:咱們再也不管這個對象究竟是不是 instanceof Duck, 而是看它有沒有 嘎嘎嘎 叫的能力。就是說咱們再也不是面向對象,而是面向接口。管它是什麼類型,什麼對象,只要實現了 嘎嘎嘎 叫的這個接口,能達到咱們的目的,就能夠了。
舉個例子:函數
// aDiv 不是數組,而是 HTMLCollection 對象 var aDiv = document.getElementsByTagName('div'); // 可是因爲 aDiv 也有 length 屬性,所以咱們能夠像數組同樣遍歷它 for (var i=0, len=aDiv.length; i<len; i++) { console.log(aDiv[i]); }
接下來一個重要的概念是 封裝
,把一個對象、方法或模塊的內部實現隱藏起來,只暴露接口供外部使用。
JS 最多見的是用當即執行函數封裝局部變量,局部函數,暴露出部分函數或變量。prototype
// 對 ming 這個對象進行了封裝,privateName 只能在當即執行函數的內部使用,外部獲取不到的。 var ming = (function() { // 乳名,外人不知道的 var privateName = '狗蛋'; // 學名 var publicName = '王小明'; var publicAge = 24; return { age: publicAge, getName: function() { return publicName; } }; }());
JS 面向對象採用的是原型克隆方式,而不是 Java 類和對象的模式。設計
所以 JS 生產對象的方式更像是 細胞分裂
,Object.prototype
做爲第一個細胞,而後分裂出 Function.prototype 、Array.prototype 、String.prototype 等,分裂出來的細胞能夠添加本身的屬性和方法。並且 JS 是沒有 類
這個東東的。code
Java 中的類像是一個模具,對象則是用這個模具印出來的,對象
第一篇文先說這麼多,後續再把設計模式一一過一遍。最重要的是,推薦你們看看騰訊大牛的書。接口