理解JavaScript面向對象的思路[1] Java開發
關鍵字:JavaScript 面向對象
一般來說大家比較熟悉的面向對象方式是基于類的面向對象,聲明一個類,然后在根據類聲明的描述去創建對象,通過類與類之間的繼承和組合關系來復用代碼。大多數情況下,基于類的面向對象語言(C++,C#,Java之類的)都把類整合進自己的類型系統,即每個類(Class)同時也是一個變量類型(Variable Type),并允許子類類型的值被賦值給父類類型變量。
而JS的設計采用了一種完全不同的思路。首先JS的類型是不可擴展的(就是說,語言的使用者無法添加新的類型)這樣就無法采用上述語言的做法。根據語言標準,JS設計了6種用戶可以使用的數據類型(因為JS是弱類型的,所以變量沒有類型,只有數據有類型):
Boolean Number String Null Undefined Object
為了實現面向對象,JS把所有的對象放到Object類型中,這樣,JS就有6種用戶可使用的數據類型。除了Undefined,JS為所有的類型提供了字面值(literal)語法,現在來看,JS的Object字面值表示設計的相當成功,現在甚至成為了一種數據交換的格式,這就是大家所熟悉的JSON.A Sample:
var aTShirt={color:"yellow",size:"big"}
作為動態語言,JS允許使用者對一個已經創建的對象添加或者刪除屬性。對一個不存在的屬性賦值即向其添加屬性,delete關鍵字被用于刪除屬性。這個delete比較容易跟C++的delete運算符混淆,后者是用來釋放不再使用的對象的。
本來有了這些語法,已經可以做基本的面向對象編程了,但是僅僅如此,JS代碼復用性比其它語言弱太多。比如,你甚至無法為一組對象做一個統一的操作,必須通過循環遍歷來實現,于是JS引入了原型(prototype),具體的實現方式是為每個對象規定一個私有屬性[[prototype]],當讀取一個對象的屬性時,如果對象本身沒有這個屬性,會嘗試訪問[[prototype]]的相應屬性。具體實現中,[[prototype]]所指向的對象仍然可以有[[prototype]],實際的訪問就是一個鏈式的操作,直到找到這個屬性或者[[prototype]]為空為止,所以常常聽到[[prototype]]鏈的說法。為了防止[[prototype]]出現循環,JS引擎會在任何對象的[[prototype]]屬性被修改時檢查。
原文轉自:http://www.anti-gravitydesign.com