JavaScript沒有提供傳統面向的對象中的類式繼承,而是通過原型委託的方式來實現對象與對象之間的繼承。JavaScript也沒有在語言層面提供對抽象類和接口的支持。正因爲存在這些跟傳統面向對象語言不一致的地方,我們在用設計模式編寫代碼的適合,更要跟傳統面向對象語言加以區別。所以在正式學習設計模式之前,我們有必須要先了解一些JavaScript在面向對象方面的知識。
1.1 動態類型語言和鴨子類型
編程語言按找數據類型大體可以分爲兩類,一類是靜態類型語言,一類是動態類型語言。
靜態類型語言在編譯時便已確定變量的類型,而動態類型那個語言的變量類型要到程序運行時,待變量被賦予某個值之後,才會具有某種類型。
靜態類型語言的優點首先是在編譯時就能發現類型那個不匹配的錯誤,編輯器可以幫助我們提前避免程序在運行期間有可能發生的一些錯誤。其次,如果在程序中明確規定了數據類型,編譯器還可以針對這些信息對程序進行一些優化工作,提高程序執行速度。
靜態類型語言的確定首先是迫使程序員依照契約來編寫程序,爲每個變量規定數據類型,歸根結底只是輔助我們編寫可靠性高程序的一種手段,而不是編寫程序的目的,比較大部分人編寫程序的目的時爲了完成需求交付生產。其次,類型的聲明也會增加更多的代碼,在程序編寫過程中,這些細節會讓程序員的精力從思考業務邏輯上分散下來。
動態類型語言的優點時編寫的代碼數量更少,看起來也更加簡潔,程序員可以把更多精力更多地放在業務邏輯上面。雖然不區分類型在某些情況下會讓程序變得難以理解,但整體而言,代碼量越少,月專注與邏輯表達,對閱讀程序是越有幫助的。
動態類型語言的缺點時無法保證變量的類型,從而在程序的運行期有可能發生跟類型相關的錯誤。這好像在商店買了一包牛肉辣條,但是要真正吃到嘴裏才知道是不是牛肉味。
在JavaScript中,當我們對一個變量賦值時,顯然不需要考慮它的類型,因此,JavaScript是一門典型的動態類型語言。
動態類型語言對變量類型的寬容给实际编码带来了很大的灵活性。由于无需进行类型检测,我们可以尝试调用任何对象的任意方法,而无需去考虑它原本是否被设计为拥有该方法。
这一切都建立在鸭子类型(duck typing)的概念上,鸭子类型的通俗说法是:“如果它走起路来像鸭子,叫起来也是鸭子,那么它就是鸭子。”
我们可以通过一个小故事来更深刻地了解鸭子类型
从前在Javascript王国里,有一个国王,他觉得世界上最美妙的声音就是鸭子的叫声,于是国王召集大臣,要组建一个1000只鸭子组成的合唱团。大臣们找遍了全国终于找到999只鸭子,但是始终还差一只,最后大臣发现一直特别的鸡,它的叫声跟鸭子一模一样,于是这只鸡就成为了合唱团的最后一员。
这个故事告诉我们,国王要听的只是鸭子的叫声,这个声音的主人到底是一个鸡还是要鸭子并不重要。鸭子类型指导我们只关注对象的行为,而不关注对象本身,也就是关注HAS-A,而不是IS-A。
下面我们用代码模拟这个故事
var duck={
duckSinging:function(){
console.log("噶嘎嘎");
}
};
var chicken={
duckSinging: function () {
console.log("噶嘎嘎");
}
};
var choir=[];//合唱团
var joinChoir=function(animal){
if(animal&&typeof animal.duckSinging===‘function‘){
choir.push(animal);
console.log("恭喜加入合唱团");
console.log("合唱团已有成员:"+choir.length);
}
};
joinChoir(duck);
joinChoir(chicken);
我们看到,对于加入合唱团的动物,大臣们根本无需检查它们的类型,而是只需要保证它们拥有duckSinging方法。如果下次期望加入合唱团的是一只小狗,而这只小狗刚好也会鸭子叫,我相信这只小狗也能顺利加入。
在动态类型语言的面向对象设计中。鸭子类型的概念至关重要。利用鸭子类型的思想,我们不必借助超类型的帮助,就能轻松地在动态类型那个语言中实现一个原则:“面向接口编程,而不是面向实现编程”。例如,一个对象若有push和pop方法,并且这些方法提供了正确的实现,它就可以被用来当作栈使用。一个对象如果有了length属性,也可以依照下标来存取属性(最好还要拥有slice和splice等方法),这个对象就可以被但那工作数组使用。
在静态类型那个语言中,要实现“面向接口编程”并不是一件容易的事情,“面向接口编程”的过程和主流的静态类型的语言不一样,因此,在Javascript中实现设计模式的过程与在一些我们属性的语言中实现过程会大相径庭。
原文:http://www.cnblogs.com/wanlum/p/5205705.html