原型語言解釋

最近有好多同事問我什麼是原型語言,原型語言有什麼特點 其實在解釋JavaScript的時候我說過好多次,但可能解釋的不太清楚,今天看了個博客覺得解釋的很好,跟大家一起共享下:
一、什麼是原型語言
悟空問觀音:什麼是原型語言
觀音:一切都是對象,對象繼承對象,這就是原型語言。
悟空:好,明白
唐僧: 詳細一點來說,
1 只有對象,沒有類;對象繼承對象,而不是類繼承類。
2 “原型對象”是核心概念。原型對象是新對象的模板,它將自身的屬性共享給新對象。一個對象不但可以享有自己創建時和運行時定義的屬性,而且可以享有原型對象的屬性。
3 每一個對象都有自己的原型對象,所有對象構成一個樹狀的層級系統。root節點的頂層對象是一個語言原生的對象,只有它沒有原型對象,其他所有對象都直接或間接繼承它的屬性。

悟空:!@#¥%……

二、誰來創建對象
A: 一切都是對象,那依靠誰來生成對象呢?
B: 人類的世界都是人,誰來生產人
A: 人來生人啊!這不是2B的問題嘛!
B: 那你剛纔問啥,2b?
上帝之音: 原型的世界,對象創建對象。

原型語言創建有兩個步驟
1. 使用”原型對象”作爲”模板”生成新對象
這個步驟是必要的,這是每個對象出生的唯一方式。以原型爲模板創建對象,這也是”原型”(prototype)的原意。
2. 初始化內部屬性
這一步驟不是必要的。通俗點說,就是,對”複製品”不滿意,我們可以”再加工”,使之獲得不同於”模板”的”個性”。
這兩個步驟很自然,也很好理解,比使用類構造對象從概念上簡單得多了,而且更符合自然。對於習慣了java基於類的面向對象的語言的程序員, 這種”新穎”的生成對象的方式一定會讓他們感到好奇。

三、內存對原型說,我愛死你了
內存說,自從有了原型,腰不酸了,腿不疼了,跳樓也有勁了
使用原型,能複用代碼,節省內存空間
舉個例子,存在舊對象oldObject,它有一個屬性name,值是’Andy’, 和一個名爲getName()的方法,如果以該對象爲原型創建一個新對象,

newObject = create(oldObject);

那麼新對象newObject同樣具有屬性name,值也是’Andy’,也有一個方法getName()。值得注意的是,newObject並不是在內存中克隆了oldObject,它只是引用了oldObject的屬性, 導致實際的效果好像”複製”了newObject一樣。
newObject = create(oldObject);創建的對象newObject只有一個屬性,這個屬性的值是原型對象的地址(或者引用),如下圖所示。

這裏寫圖片描述

四、原型鏈
本屌在街上見到一個戰鬥只有5的渣,準備欺負他找點樂子,沒想到,他說:我爸是李剛,我爺是胡哥,我曾爺爺也是…
原型世界的對象也一樣,對象不是一個人在戰鬥,他在原型鏈上的關係能給予他強大的力量。
當對象訪問屬性的時候,如果在內部找不到,那麼會在原型對象中查找到屬性;如果原型對象中仍然找不到屬性,原型對象會查找自身的原型對象,如此循環下去,直至找到屬性或者到達頂級對象。對象查找屬性的過程所經過的對象構成一條鏈條,稱之爲原型鏈。newObject,oldObject和topObject就構成一條原型鏈。
下面列出newObject的3種的查找屬性情況

newObject查找name,
1 內部找不到,到原型對象中查找
2 oldObject中查找到了name,成功返回;

newObject查找toString
1 內部找不到,到原型對象中查找
2 oldObject中查找不到toString,到原型對象中查找
3 topObject中查找到了toString,成功返回;

newObject查找valueOf
1 內部找不到,到原型對象中查找
2 oldObject中查找不到valueOf,到原型對象中查找
3 topObject中還是找不到,而且topObject是頂層對象,所以返回錯誤或者空值。

對象會通過原型鏈動態地查找屬性,對象的所擁有的屬性是動態的。
如果原型鏈上的一個對象發生的改變,那麼這個改變也會馬上會反應到在原型鏈中處於該對象下方的所有對象,這是一個非常有用的特性。

五、術語: 繼承
對象A問上帝:繼承是什麼?
上帝問A :你知道你爲什麼那麼帥嗎?
A :不知道
上帝 :你看看正在看博客的那位超級帥哥,他是你爹,你理解什麼是繼承了吧

在java中 通過語句class Cat extends Animal定義Cat類繼承Animal類,Cat類產生的實例對象便擁有了Animal類中定義的屬性。類似地,在基於原型的語言中, 通過cat = create(animal)創建以animal對象爲模板的cat對象,cat對象便擁有了animal對象中的屬性,因此可以說cat對象繼承了 anmial對象。

六、小結
原型的本質就是對象引用原型對象的屬性,實現代碼複用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章