1. 程式人生 > >Javascript 定義類(class)的三種方法

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()方法的外面即可。

然後,生成兩個例項物件

這時,如果有一個例項物件,修改了共享的資料,另一個例項物件也會受到影響。



後記:由於工作需要,最近開始學習JS 和 node.js開發,之前接觸的比較少,內容中有什麼不對的希望大家可以及時指出,謝謝。

本人之前一直從事android方面的開發,如果有什麼android方面的問題歡迎隨時交流。