[Javascript] 類與原型的初衷與演變

JavaScript 對象:我們真的需要類比類嗎?
https://www.infoq.cn/article/kZSJo5y9trhtGSlD_O3f?utm_medium=hao.caibaojian.com&utm_source=hao.caibaojian.com

早期的 JavaScript 程式師一般都有過使用 JavaScript“模擬物件導向程式設計”的經歷,不過 JavaScript 本身就是物件導向的,它並不需要類比,只是它實現物件導向的方式和主流的流派不太一樣,所以才讓很多人產生了誤會。

原型是順應人類自然思維的產物。中文中有個成語叫做“照貓畫虎”,這裡的貓看起來就是虎的原型,所以由此,我們可以看出,用原型來描述物件的方法可以說是古已有之。最為成功的流派是使用“類”的方式來描述物件,這誕生了諸如 C++、Java 等流行的程式設計語言。這個流派叫做基於類的程式設計語言。

“基於類”的程式設計提倡使用一個關注分類和類之間關係開發模型。在這類語言中,總是先有類,再從類去產生實體一個物件。類與類之間又可能會形成繼承、組合等關係。類又往往與語言的類型系統整合,形成一定的編譯時能力。

還有一種則就是基於原型的程式設計語言,它們利用原型來描述物件。我們的 JavaScript 就是其中代表。

“基於原型”的程式設計看起來更為提倡程式師去關注一系列物件實例的行為,而後才去關心如何將這些物件,劃分到最近的使用方式相似的原型物件,而不是將它們分成類。基於原型的物件導向系統通過“複製”的方式來創建新物件。

JavaScript 並非第一個使用原型的語言,在它之前,self、kevo 等語言已經開始使用原型來描述物件了,事實上,Brendan 更是曾透露過,他最初的構想是一個擁有基於原型的物件導向能力的 scheme 語言。在 JavaScript 之前,原型系統就更多與高動態性語言配合,並且多數基於原型的語言提倡運行時的原型修改,我想,這應該是 Brendan 選擇原型系統很重要的理由。


#Javascript, class, prototype, 類, 原型

留言