標籤:art 而不是 UNC 設計 hub ref 優雅 部分 系統
今天開始閱讀《JavaScript設計模式與開發實踐》,對於設計模式的學習一直渴望已久。
設計模式的定義是:在物件導向軟體設計過程中針對特定問題的簡潔而優雅的解決方案。
其實平時在工作中不知不覺在使用某些設計模式,只是我們不知道而已。
動態類型語言和靜態類型語言
- 靜態類型語言在編譯時間便已確定變數的類型,而動態類型語言的變數類型要到程式啟動並執行時 候,待變數被賦予某個值之後,才會具有某種類型。
- 靜態類型語言的優點首先是在編譯時間就能發現類型不符的錯誤,編輯器可以協助我們提前 避免程式在運行期間有可能發生的一些錯誤。並對程式進行一些最佳化工作,提高程式執行速度。
- 動態類型語言對變數類型的寬容給實際編碼帶來了很大的靈活性。由於無需進行類型檢測,我們可以嘗試調用任何對象的任意方法,而無需去考慮它原本是否被設計為擁有該方法。
這裡就有一個 鴨子類型 的概念。
“如果它走起 路來像鴨子,叫起來也是鴨子,那麼它就是鴨子。”
利用鴨子類型的思想,我們 不必藉助超類型的協助,就能輕鬆地在動態類型語言中實現一個原則:“面向介面編程,而不是 面向實現編程”。
多態
多態的最根本好處在於,你不必再向對象詢問“你是什麼類型”而後根據得到的答案調用對象的某個行為——你只管調用該行為就是了,其他的一切多態機制都會為你安排妥當。
JavaScript不會進行類型檢查,很容易實現多態,只要你具有這個行為就好。而靜態類型語言需要被設計為可以向上轉型:當給一個類變數 賦值時,這個變數的類型既可以使用這個類本身,也可以使用這個類的超類。
封裝
封裝的目的是將資訊隱藏,封裝應該被視為“任何形式的封裝”,也就是說,封裝不僅僅是隱藏資料,還包括隱藏實現細節、設計細節以及隱藏對象的類型等。
原型模式
在 JavaScript中,每個對象都是從 Object.prototype 對象複製而來的,這樣的話, 我們只能得到單一的繼承關係,即每個對象都繼承自 Object.prototype 對象,這樣的對象系統顯然是非常受限的。
但是我們可以動態地指向其他對象。這樣一來,當對象 a 需 要借用對象 b 的能力時,可以有選擇性地把對象 a 的構造器的原型指向對象 b,從而達到繼承的效果。如下代碼就是常用的原型鏈繼承方式:
var obj = { name: ‘sven‘};var A = function(){};A.prototype = obj;var a = new A();console.log(a.name); // sven
Github: https://github.com/Vxee/articles/issues/11
JavaScript設計模式與開發實踐【第一部分】