标签:
网上的关于原型继承的文章多入牛毛 但是我感觉并不适合新手了解 首先假如这位新手了解过面向对象java啊 c#啊他会理解继承 但是和javascript的继承有有所不同,又假如这位新手初入前端 以前没了解过面向对象 你和他说一大堆术语 更加把他搞得蒙头转向。我在这里尝试用人类认知的模式来解释什么事原型继承以及为什么需要它。
从某种意义来说面向对象的三大特性在我看来是为了“偷懒”(纵观全世界科技发展莫不如此)而由聪明人想出来的法子,在代码世界中,代码的复用也就是多次使用时司空见惯的,比如你一进门就写的 hello world再把它变大写 就算这么简单的东西 假如要你写一万遍hello world 你不可能每次按照那个模式写一万遍,那你可能要写个几百年(个人猜测 哈哈),所以你会想个法子把他分装成一个函数 再用循环不停输出。至此你的代码也简化很多,可读性也增强了几个倍数。继承就是异曲同工之妙,假如,有一个老头,他是打铁的有一手非常好的打铁技巧(对温度和材质的选用等等控制的很好),他又不巧有两个儿子,这两个儿子又不愿意走他的老路一个要去做陶瓷(注意这个事业也需要对火候温度有高要求),另外一个要制作某种耐热材料(也得像他老头学习技巧),牛顿说过要站在巨人身上才能看的更远,这对兄弟也是站在他老头肩膀上才能各自做自己想做的事,他们就是继承了父亲教他们的基本关于材料和温度控制的技巧,这样不用自己去探索(类似于自己又重新打一遍helloword再转成大写,大家都知道一个打铁的老头如果传承技巧,而他的儿子又愿意学习他的技巧是不会教出一个会手绣的儿子的),这个老头就相当于原型,他确保了一定的稳定性(他生出来的对象和他有相似性)和继承性(继承某种方法))。javascript中万物皆是对象(万物都有自己的方法和属性,就像黑客帝国里面的各种假人一样虽然假的但是都会工作啊 吃饭啊等),一个对象是由一个构造函数造出来的这是当然的 不可能凭空出现一个对象来(宇宙定律 能量不会凭空产生或者消失 只会存在各种转换),这个对象就是这个构造函数‘转换’出来的一个.这个‘能量’总归有一个源头(宇宙大爆炸,科学家现在说无法解释)对应着null,就是说所有的对象和函数的最终老头就是null,
儿子当然具有老子的一部分特征和他想要学习的方法,假如他的老头不止会打铁还会捕鱼,他的儿子们不用两个都学习 只需要各取所需就可以。在原型继承中 早出来的儿子他有一个属性指向造出来他这个方法的始作者他的老头(他老头生他就相当于用这个构造函数生的,毕竟不可能凭空出来一个大胖儿子),这个构造函数当然也指向它的老头(毋庸置疑的,其他姓的老头没可能生出这个老头的儿子),这个老头精力如果无限丰富 当然可以生出来无限个儿子来,这些儿子想用什么东西 想学习什么都可以继承 他们拥有他老头所有方法(当然他们可以选择)。原型链中的东西就是一层一层往上面找的(他的儿子当然也会生儿子 他也可能自学其他技能,他的后代再来继承,所以对应人类世界你会发现族谱上祖先和后代都完全可能不是一个工种 样貌等差异,但是基因中的某些都是的一样的)。所以总结。原型继承就是生出来的对象可以用他老头的东西,他的老头也有老头(世世代代不停息)。不过如此罢了。那些代码只不过是为了描述这个过程而做事的(总要存在一个链接指向枢纽),就是_proto_,那个构造函数有特殊的prototype(毕竟它不是人)都指向老头,再通过属性指向他的老头。
第一篇博客文章就介绍到这里了,有问题一起探讨 别喷 都做个文明人
标签:
原文地址:http://www.cnblogs.com/chouxiang/p/5727879.html