其實要談談javascript的對象鏈。
唐納德.川普 當選美國第四十五任總統。當選以后,川普立即給蒂姆.庫克打電話
川普(Trump):“我說廚子啊,我是美國總統,我現在命令你把在中國的apple工廠搬回美國,iPhone8就在國內生產,好兌現我對廣大藍領選民的承諾啊”.
庫克(Cook):“呵呵,這是一個鵝妹子嚶的建議嗷,but no”.建在中國的工廠是搬不回來了。
開個玩笑算是開場白。經過幾天的理解,發現javascript的對象
鏈居然和現代企業的生產鏈居然十分的相似。字面都帶鏈啊。這里就借apple的iPhone8的生產來理解js的對象鏈??赡懿皇鞘仲N切。但是在一定程度上能幫你理解相關概念。
要學習js功,必先自宮,如不自宮,必不成功。 如果你帶著java,C++,php的對象原理來學習js的對象繼承,會撞得滿頭包,尤其是看到和其他語言一樣的關鍵字時,千萬不能拿老概念來套。js自成體系,所以學習js的對象鏈要理解其自身的特點。我先擺出來。1js中是沒有類這個抽象概念的,js中都是對象
。2 js對象繼承實際發生的是一種“委托關系”。這種委托關系是js的對象鏈的精華所在。
這個“委托關系”聽著耳熟嗎?什么?不熟。那么聽過OEM
么?什么?也沒有聽過OEM
。好吧知道富士康么?什么?沒聽過?同學火星冬天冷嗎?
好吧,OEM就是代工工廠。這流程就是一個公司擅長設計,但是他不生產產品,他委托
另一個擅長制造的工廠生產產品。另一個工廠又會把其中一部分生產過程委托
給其他工廠,這個委托關系可以一直持續下去。如果理解js對象繼承鏈的人立刻會知道我說的原理。沒有理解也沒有關系,下面就借著iPhone8的生產來看看這個委托關系
。
我們把這個過程稍微簡化一下,要不全過程寫完我也沒有那個能力,寫全過程要找郭明池來寫。
我把ip8的生產簡化為:
1.硬件設計
2.軟件設計
3.初試
4. 整機生產
5. 電池生產
6. 屏幕生產
7. 外設生產
下面會用一些偽代碼來說明這個問題。js中都是對象,沒有類。類都是實體,是在內存中實際存在的。在整個生產中的公司都是對象?,F在我們看看這些對象
//蘋果公司對象
class Apple {
init(){ //初始化apple公司
founder:"Steve Jobs";
current leader:"Tim Cook";
Designer:"Ivy";
Location :"South. CA"
}
programSoftware(){ //軟件制作和設計
return (" make ios11");
}
designHardware(){ //硬件原型設計
(" make ios11");
(" make protype of ip8");
("design cpu of a11 ");
}
legalGroup(){ //法務部 負責和華為打官司
("lawsuit with huawei")
}
}
//這就在javascript里面給apple公司建立了一個對象,整個對象有初始化的屬性, 還有三個自己擅長的方法。
話說2007年,喬布斯還在世的時候,他找到富士康公司老板郭臺銘說:”我說臺銘啊,我想找個工廠生產手機,以前富士康生產的imac不錯,這才還是委托你們來生產吧“ 。郭臺銘是:好吧。我馬上建立富士康蘋果手機工廠
。為了好理解我加了命名空間
,看見了么_。2017年,Apple推出iphone 10周年了,又要開始生產了。
//FskApple這個對象就是Apple的繼承者,他本身是一個對象,并不是實例化出來的
//FskApple和Apple盡管用了extends關鍵字,但是他們沒有從屬關系,僅僅是委托關系而已
FskApple extends Apple (){
init(){ //fsk的初始化屬性
founder:"郭臺銘";
location:"鄭州";
}
makeHardware(){ //硬件生產
(" make module ip8"); //生產模具,這是fsk的特長
(" Assemble ip8"); //組裝iphone8,這也是fsk的特長
}
}
富士康并不精通屏幕生產,所以富士康有把屏幕的生產委托給了LG公司.LG公司要給蘋果生產最新的AMOLED屏幕。這里和實際的委托有出入只是為了好理解
. 好么又一個工廠出來了。富士康LG工廠。
//LG富士康工廠又受fsk的委托生產
LgFsk extends FskApple (){
init(){ //LgFsk的初始化屬性
founder:"unknow";
location:"seoul";
}
makeScreen(){ //屏幕
(" make circuit"); //生產背板電路
(" make panel"); //生產面板
}
}
```
實際的生產的委托關系比這個復雜的多,js的對象鏈也比這個復雜一點。我在這里把它簡化為一條線的委托關系只是為了好理解。
三個對象的`委托鏈`建成以后,就可以投入生產了。富士康公司要調用ip8的設計方法時,他并不要自己去創建這個方法,因為他不擅長這個方法,他直接利用和蘋果公司的委托關系借用蘋果公司的設計方法就可以了。 蘋果是委托富士康來生產,從整個產業鏈來說也可以認為是富士康委托蘋果公司做了設計工作。蘋果不生產,富士康不設計,但是一旦兩者產生委托關系以后,兩者可以發揮各自的特長,2017年iPhone8就在這個委托鏈中生產出來了。
現代企業想改變這么一個發揮各自優勢的鏈時多么的不容易,再也找不到更好的方法了。所以庫克說蘋果工廠再也回不去了。
為此我畫了一張圖,比較丑,湊活著看吧。這里就是三個對象之間的繼承關系。我覺得叫連接關系比較好一點。

原理如此,三個對象有繼承關系,但是之間并不是從屬關系。對象都具有自己擅長的方法,其他對象的方法也不活再費力去做一個獨立的副本。lg要設計方法可以找富士康,富士康沒有的話又可以找蘋果。
我們去掉細節來看,js的對象繼承鏈只是有些關鍵字借用了傳統的面向對象的東西,但是實際上js和java的對象是完全不同的。
###最后再強調一句:javascript中的對象繼承鏈不是對象之間的從屬關系,而是一種委托和合作關系。理解這一點后面的學習就好辦了。
初學者水平,不知道這個通俗理解是否得體和準確?