面向对象还是基于对象?
一些困惑
在学习JavaScript的过程中,我们常常遇到一些简单定义却又意义深远的概念。这些概念我们一开始接触时会非常的困惑,当你努力试图去理解这些概念所蕴含的逻辑意义并感到非常痛苦时,有人告诉你,不要着急,慢慢来,随着学习的深入,等学到更多的技术细节时,这些困惑和疑虑自然烟消云散。事实上,情形并非如此。比如说,“JavaScript中,函数是一等公民”,你在多大程度上理解了它所代表的意义呢?如果很不幸地,你将JavaScript作为了自己编程生涯的启蒙语言,那么我可以很负责任的告诉你,哪怕你看遍所有JavaScript的技术书籍,看遍所有JavaScript的视频教程,你也无法吃透它背后的深刻意义。为什么呢?因为JavaScript并非是自成一派的语言,也没有自己独特的设计理念,它更多地是其他编程语言的改良版,尤其是它参考了很多Java的语言特性,又融合了函数式编程的设计理念。因此,给人的感觉是,什么都像,又什么都不像。我们不妨打个比较形象的比方,李秋水在《易筋经》的基础上发明了《玉女心经》,《易筋经》是宏幅巨著,《玉女心经》仅仅是一本小册子。如果你想成为高手,光练习《玉女心经》是不够的,必须要辅以《易筋经》一起练习。我们今天要探讨的是以Java为代表面向对象编程思想和以JavaScript为代表的基于对象或者称之为基于原型链的面向对象编程思想之间的千丝万缕的关系。很显然,面向对象是《易筋经》,基于对象是《玉女心经》。我们还是从头说起吧!
脚本语言和编译语言
脚本一词来源于戏剧领域。一个剧本要要呈现出活灵活现的舞台效果,就离不开脚本,脚本是在不脱离剧本框架下的补充和说明,用以呈现丰富多彩的舞台效果。事实上,如果完全去除脚本,戏剧的故事情节不会受到影响,故事的发展脉络仍然如故,只是我们就无法看到立体多面的舞台效果了。在绝大多数的网页中,如果我们在浏览器端禁用掉脚本,那么网页的功能并不会受到影响,只是我们就无法体验到更为友好的交互效果了。脚本语言是这样一种语言,它无法脱离它的宿主,就像电影脚本无法脱离电影剧本一样,否则它就没有任何意义。那么和编译语言相比,它就有很明显的局限性。编译语言能最终生成机器码,并形成可以独立执行的文件并且在执行过程中计算机会给它分配独立的进程。简单来说,编译语言是可自执行的。它就像一个独立的剧本,有完整的故事流程。脚本语言是编译语言的一种补充,用以实现更丰富的细节和更多样的交互。它没有自己独立的进程,也不能编译成机器码,计算机压根就不能识别它,需要由宿主进程解释执行,脱离宿主进程的脚本没有任何意义。在专业人士看来,脚本语言的这些特性注定它只能做点锦上添花的事,是不堪大用的。事实发展也确实如此,就目前计算机发展的历史来看,脚本语言绝大多数时候都处于边缘状态。就是在这样地情况下,JavaScript诞生了!
JavaScript诞生
可以很肯定地说,计算机领域每一项技术的诞生都是为了解决某一个具体问题。很多技术在之后能够大行其道,变得非常流行,也并非一开始就设计好的。JavaScript就是这样一种语言。那么,JavaScript的诞生又是为了解决什么问题呢?实际上,在JavaScript诞生之前就已经有了动态网页。那时候的网页已经能够允许用户通过注册和登陆等方式向服务器提交用户的个人信息,服务器可以根据不同的个人信息提供独具特色服务。网站从此不再是一个公共内容发布平台,大家从同一个网站获取的内容不再是千篇一律。但是与此同时也产生了一个问题,就是用户在填写个人信息的时候是极容易出错的,服务器每天要处理大量的用户的错误输入致使那些正确输入个人信息的用户也大受影响。那么这个时候就需要一种技术,能够验证用户输入格式是否正确,从而在提交服务器前过滤掉不符合要求的请求,并且在用户填写个人信息过程中能够与用户进行实时交互以帮助用户正确填写请求参数。这样既能减轻服务器压力,也能给用户提供更友好的交互体验。JavaScript的最初目的就是为了解决这个问题。JavaScript解释器也仅仅是为达到该目的的辅助工具。谁也没有想到,解释器会变得越来越强大。
解释器的强大
近些年来,JavaScript的发展如日中天,风头甚至都盖过了目前业内一些比较流行的编译语言。事实上,并不是JavaScript本身在变强大,脚本语言的短板是不可避免的,它都不能自执行,既然没有翅膀,你岂能上天?而是JavaScript背后的解释器在变得强大。解释器最初对计算机资源的访问权限非常有限,通常仅限于当前网页的页面元素,其它的都是禁区,因为这涉及到用户隐私,谁也不敢轻易触犯。到此为此,JavaScript并没有得到多大发展,它仍然还仅是一堆又一堆的用以实现网页特效的砖块代码,甚至很多人都不愿意认真去读它,仅仅验证一下效果,确认效果OK,就将它拷贝来拷贝去。事情的转机是服务端解释器的兴起,nodejs的横空出世改变了这一切。它的背后是强大的V8引擎。V8引擎最初是一款赛车引擎,它以动力强劲而又性能稳定而著称。刚开始的时候,听起来多新鲜啊,用脚本写服务端,听起来有点像用砖块造飞机。不少专业人士都认为这仅是一个噱头,用不了多久终归是尘归尘,土归土,王老五还是二百五。事情的发展出乎很多人的意料,人家不仅仅造了飞机,而且坦克,大炮全能造,而且都是货真价实的家伙。JavaScript一夜成名,她火了,红得发紫。她真的上了天!
强大的V8引擎
V8引擎是一款非常专业非常复杂的JavaScript引擎。之所以叫引擎而不叫解释器,是因为和传统解释器相比,是因为它对计算机资源的访问权限得到了全方位的提升,可以说是已经没有了禁区,而且在性能和设计理念等方面都已经不可同日而语了。或者我们可以简单这样理解,因为它是工作在服务端,所有我们管它叫引擎。它的日常工作和普通解释器一样,也是解释执行JavaScript。如果你想更深入地了解V8引擎,请参阅更为专业地文档的。尽管V8引擎是开源的,尽管你可以随意下载和阅读V8引擎源码,但是如果没有真正懂V8的专业人士的指导,你根本不可能了解V8真正的核心设计理念。阅读代码通常只是管中窥豹,不见全貌。在本人看来,V8就是《易筋经》,保罗万象,而nodejs就《玉女心经》,都是些花架子。不过,话说回来,应付日常开发,《玉女心经》就已经足够了。网上有不少人仅仅是看过几遍V8源码就说自己懂V8,我觉得他们像个猪头,你不能说自己拆过几遍收音机就认为自己懂收音机原理。想要真的懂,还是请高人指点迷津吧,最好是V8的原开发者。
好了,今天暂时告一段落,后面会继续论述。。