其实要谈谈javascript的对象链。
唐纳德.川普 当选美国第四十五任总统。当选以后,川普立即给蒂姆.库克打电话
川普(Trump):“我说厨子啊,我是美国总统,我现在命令你把在中国的apple工厂搬回美国,iPhone8就在国内生产,好兑现我对广大蓝领选民的承诺啊”.
库克(Cook):“呵呵,这是一个鹅妹子嘤的建议嗷,but no”.建在中国的工厂是搬不回来了。
开个玩笑算是开场白。经过几天的理解,发现javascript的对象
链居然和现代企业的生产链居然十分的相似。字面都带链啊。这里就借apple的iPhone8的生产来理解js的对象链。可能不是十分贴切。但是在一定程度上能帮你理解相关概念。
要学习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中都是对象,没有类。类都是实体,是在内存中实际存在的。在整个生产中的公司都是对象。现在我们看看这些对象
//苹果公司对象
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就在这个委托链中生产出来了。
现代企业想改变这么一个发挥各自优势的链时多么的不容易,再也找不到更好的方法了。所以库克说苹果工厂再也回不去了。
为此我画了一张图,比较丑,凑活着看吧。这里就是三个对象之间的继承关系。我觉得叫连接关系比较好一点。
![screenshot_20.png](http://upload-images.jianshu.io/upload_images/2044710-3d40a51a813a002b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/600)
原理如此,三个对象有继承关系,但是之间并不是从属关系。对象都具有自己擅长的方法,其他对象的方法也不活再费力去做一个独立的副本。lg要设计方法可以找富士康,富士康没有的话又可以找苹果。
我们去掉细节来看,js的对象继承链只是有些关键字借用了传统的面向对象的东西,但是实际上js和java的对象是完全不同的。
###最后再强调一句:javascript中的对象继承链不是对象之间的从属关系,而是一种委托和合作关系。理解这一点后面的学习就好办了。
初学者水平,不知道这个通俗理解是否得体和准确?