导言: 作为JavaScript初学者的本菜鸡而言,刚一开始接触这门语言我就被他的原型模式给吓到了。并且在相当长的一段时间之内,我都完全不能理解或者不能接受这个模式。直到最近经过多方调查和思考才有所明悟。本篇文章就来记录一下我对JavaScript为什么使用原型模式而不是用类模式这个问题的一点看法。
为什么是原型模式面向对象
是啊,为什么是原型模式呢?类模式那么的优雅,那么容易理解,当今世界扛把子级别的语言无论是c++,Java还是Python等,全部都是基于类的面向对象。基于类的面向对象就类似于铸模和铸件的关系。我们精心维护好这样的铸模,然后生成一堆的铸件,这些铸件就可以愉快的运行在各行各业,起到相应的功能。当铸件出了一些问题之后没有关系,我重新在用铸模搞出一个铸件就可以了。也有可能铸模跟不上时代的发展了,也没有关系,我重新调整一下铸模的结构,这样以后就能生产出紧跟行业最新需求的铸件了。基于类的面向对象是多么的好啊,有了它我们就可以建设美丽新世界了!
甚至我一度以为,面向对象就是指的基于类的面向对象。直到我遇到了邪恶的JavaScript,一下子让我三观尽碎!
不过我还是存有一点侥幸心理,或许可能是那个JavaScript设计者设计这门语言时间过于仓促,没有考虑到基于类的面向对象这种设计是多么优雅,直到我后来读到下面这段内容:
在Brendan Eich为JavaScript设计面向对象系统时,借鉴了Self和Smalltalk这两门基于原型的语言。之所以选择基于原型的面向对象,不是因为时间匆忙,它设计起来相对简单,而是因为从一开始Brendan Eich就没有打算在JavaScript中加入类的概念。
苍天啊!JavaScript居然没有类的概念。到了ES6出了class关键字之后,也不过是基于原型的一种语法糖。可是你都没有类了,为什么还要搞new关键字,简直是脱裤子放屁。后来我又读到一段话:
然而很不幸,因为一些公司政治原因,JavaScript 推出之时受管理层之命被要求模仿 Java,所以,JavaScript 创始人 Brendan Eich 在“原型运行时”的基础上引入了 new、 this 等语言特性,使之“看起来更像 Java”。
好吧!不管怎么说,就是基于原型了。但是为什么要选原型呢?下面谈谈我的理解。
我想设计模式的差异可能是因为前端和后端面临的情况不太一样。对于在服务端运行的程序而言,更应该追求稳定性。而在客户端运行的程序,经常要面临和用户交互、渲染等任务,动态性的成分更多一些。因此服务端的程序使用基于类的面向对象,走铸模、铸件路线。我们做修改基本只改模具,不要铸件发挥自己的主观能动性。比如你在写Python或者Java程序的时候,你生成实例化对象之后,很少会要求对象变来变去吧。
而JavaScript希望对象尽可能发挥自己的主观能动性,干脆直接把模具扔了。玩起了原型模式和原型继承。没有模具那该如何搞对象呢?这个我们后面会讲到,首先来看一下JavaScript对象的主观能动性吧。
let