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