Javascript 定義類(class)的三種方法
Javascript語言不支援“類”, 但是可以用一些變通的方法,模擬出“類”。
一、建構函式法
經典的方法,書上也是這樣教的。它用建構函式模擬類,在內部用this關鍵字指代例項物件。
生成例項的時候,使用new關鍵字。
類的屬性和方法,還可以定義在建構函式的prototype物件之上。(具體什麼是prototype, 後面找機會再研究吧)
二、Object.create() 方法
為了解決生成物件麻煩,Javascript國際標準提出一個新的方法Object.create()。用這個方法,“類”就是一個物件,不是函式。
然後直接用Object.create()生成例項,不需要用到new。
目前,各大瀏覽器的最新版本(包括IE9)都部署了這個方法。如果遇到老式瀏覽器,可以用下面的程式碼自行部署。
這種方法比"建構函式法"簡單,但是不能實現私有屬性和私有方法,例項物件之間也不能共享資料,對"類"的模擬不夠全面。
三、極簡主義
"極簡主義法"(minimalist approach)
1、封裝
這種方法不使用this和prototype,程式碼部署起來非常簡單,這大概也是它被叫做"極簡主義法"的原因。 首先,它也是用一個物件模擬"類"。在這個類裡面,定義一個建構函式createNew(),用來生成例項。
然後,在createNew()裡面,定義一個例項物件,把這個例項物件作為返回值。
使用的時候,呼叫createNew()方法,就可以得到例項物件。
這種方法的好處是,容易理解,結構清晰優雅,符合傳統的"面向物件程式設計"的構造,因此可以方便地部署下面的特性。
2、繼承
讓一個類繼承另一個類,實現起來很方便。只要在前者的createNew()方法中,呼叫後者的createNew()方法即可。 先定義一個Animal類。
然後,在Dog的createNew()方法中,呼叫Animal的createNew()方法。
這樣得到的Cat例項,就會同時繼承Cat類和Animal類。
3、私有屬性和私有方法
在createNew()方法中,只要不是定義在dog物件上的方法和屬性,都是私有的。
上例的內部變數sound,外部無法讀取,只有通過dog的公有方法makeSound()來讀取。
4、資料共享
有時候,我們需要所有例項物件,能夠讀寫同一項內部資料。這個時候,只要把這個內部資料,封裝在類物件的裡面、createNew()方法的外面即可。
然後,生成兩個例項物件
這時,如果有一個例項物件,修改了共享的資料,另一個例項物件也會受到影響。