JS為什麼會有原型的概念?

所有物件都有原型嗎

作者:鬼哥 來源:

前端人

JS為什麼會有原型的概念?

因為早期的瀏覽器只能用來瀏覽,不具備與訪問者互動的能力。比如,如果網頁上有一欄“使用者名稱”要求填寫,瀏覽器就無法判斷訪問者是否真的填寫了,只有讓伺服器端判斷。

如果沒有填寫,伺服器端就返回錯誤,要求使用者重新填寫,這太浪費時間和伺服器資源了。

這個時候需要一門網頁尾本語言,這種指令碼語言能夠完成一些簡單的操作,比如判斷使用者有沒有填寫表單。剛好這個時候是向物件程式設計(object-oriented programming)最興盛的時期,C++是當時最流行的語言,而Java語言也馬上推出。

所以Javascript作者也受到了啟發,Javascript裡面所有的資料型別都是物件(object),這一點與Java非常相似。但是直接使用java的“繼承”機制來實現,又覺得過於笨重,但是,Javascript裡面都是物件,必須有一種機制,將所有物件聯絡起來。所以,javascript作者最後還是設計了“繼承”。

但是,他不打算引入“類”(class)的概念,因為一旦有了“類”,Javascript就是一種完整的面向物件程式語言了,這好像有點太正式了,而且增加了初學者的入門難度。

他考慮到,C++和Java語言都使用new命令,生成例項。

C++的寫法是:

ClassName *object = new ClassName(param);

Java的寫法是:

Foo foo = new Foo();

這時,他想到C++和Java使用new命令時,都會呼叫“類”的建構函式(constructor)。他就做了一個簡化的設計,在Javascript語言中,new命令後面跟的不是類,而是建構函式。

但是很快發現用建構函式生成例項物件,有一個缺點,那就是無法共享屬性和方法。

每一個例項物件,都有自己的屬性和方法的副本。這不僅無法做到資料共享,也是極大的資源浪費。

最終加入了prototype屬性的引入

考慮到這一點,作者決定為建構函式設定一個prototype物件屬性。

所有例項物件需要共享的屬性和方法,都放在這個物件裡面;那些不需要共享的屬性和方法,就放在構造函數里面。

例項物件一旦建立,將自動引用prototype物件的屬性和方法。

由於所有的例項物件共享同一個prototype物件,那麼從外界看起來,prototype物件就好像是例項物件的原型,而例項物件則好像“繼承”了prototype物件一樣。

面試總結回答

JavaScript採用原型程式設計,所有物件都能共享原型上的方法,節省記憶體;

同時基於原型這一實現思想,JavaScript透過找對原型鏈,方便地實現了繼承。

這就是原型程式設計帶來的2個最大好處!!!

參考資料

內容有最簡化,如果需要看原始總結請檢視阮一峰部落格↓

http://ruanyifeng。com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript。html

https://blog。csdn。net/daigualu/article/details/54772799