关于JavaScript诞生之初的趣事

JavaScript的前世
服务器君一共花费了304.627 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

我在读很多优秀的JavaScript源码时候常常被它诡异的语法搞的精疲力尽,所以时不时的加固JavaScript基础知识是十分有必要的,这些知识每次温故或者你换个角度去思考都能收获颇多,那么如此深不可测的语言是怎么诞生的呢?它的祖师爷在创造它的时候是基于什么思考的呢?我想如果大伙知道了这段历史,或许理解起JavaScript来就会感觉跟轻松些跟惬意些,说不定很多人因此而想好好的学习它。人总有点八卦的小毛病,回顾下一件事情或一个东西的历史,探寻他们历史过程中的种种有趣的细节,一定是件很有意思的事情。

这位就是JavaScript的开山祖师爷:Bremdan Eich(布兰登·艾奇),现在在Mozilla公司担任CTO。(额头好长啊,又宽,要是希特勒在世一定会说这是太标准的雅利安人)。

JavaScript的诞生于浏览器的鼻祖网景公司(Netscape),大约是1994年左右,网景公司(Netscape)发布了Navigator浏览器0.9版,这是一款很经典的浏览器,网景公司(Netscape)的用户数因此而出现了井喷的态势,但是Navigator0.9不具备和访问者互动的能力,在那个上网速度比蜗牛还慢的时代,网景公司(Netscape)急需一种脚本语言,使得浏览器和网页进行交互,从而提升用户的体验。

针对这个问题,网景公司(Netscape)有两种选择,一是采用现有的脚本语言,二是自己发明一个新的脚本语言。当时网景公司(Netscape)的高层对这个问题争论不休。在这些喋喋不休的争论里,时间走到了1995年,这一年发生了一件创造历史的大事件编程语言Java横空出世,Java凭借“一次编写,到处运行的”强大宣传,大有未来主宰的霸气,这些让网景公司(Netscape)高层们一下子被Java所俘获,如是网景公司(Netscape)和sun公司结盟,网景公司(Netscape)不仅允许Java程序以applet的形式嵌入到浏览器,直接在浏览器里面运行,甚至还打算把Java作为脚本嵌入到网页,只是最后发现网页会变的过于复杂而放弃,但是JavaScript的Java印记永远都挥之不去。

事情的转折发生在1995年4月,网景公司(Netscape)录用了Bremdan Eich(布兰登·艾奇)(虽然Bremdan Eich(布兰登·艾奇)是JavaScript的祖师爷,但是他的介入或许也是JavaScript悲剧的开始)。我们还是接着说网景公司(Netscape)吧,1995年5月,网景公司(Netscape)做出了决策,未来的网页脚本语言必须看上去和Java足够相似,但是比Java简单,使得非专业的网页作者能很快的上手。

Bremdan Eich(布兰登·艾奇)被任命为这个简化版的Java的设计师。但是Bremdan Eich(布兰登·艾奇)对Java一点兴趣都没有,为了应付公司的安排的任务,他只用10天时间就设计出了JavaScript。悲剧就这么诞生了。

Brendan Eich的主要方向和兴趣是函数式编程,网景公司招聘他的目的,是研究将Scheme语言作为网页脚本语言的可能性。Brendan Eich本人也是这样想的,以为进入新公司后,会主要与Scheme语言打交道。(没想到美国公司也有这样的恶习,我以前有家公司非常的BT,特别是对刚毕业或者工作时间不长的程序员,你想做Java我偏偏不给你做,让你做C#,你想做C#,别天真,你去倒腾Java,很多程序员就是这么被致残的)。

10天诞生一种语言,不管怎么说我还是把Brendan Eich当神看。但是神创造世界也不能太一蹴而就了,我们这些凡夫俗子很多时候做个小功能模块如果领导就给你10天时间,也会叫苦连天的,10天诞生一种语言这不是神还是啥啊。由于JavaScript设计的时间实在太短,导致很多细节考虑不周,因此JavaScript写出的程序混乱不堪,成了许多程序员的梦魇,差点被人抛弃,直到ajax的出世,才让人们终于找到理由忍受他的畸形。 

总的来说啊,Brendan Eich设计思路是这样的:

  1. 借鉴C语言的基本语法;
  2. 借鉴Java语言的数据类型和内存管理;
  3. 借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;
  4. 借鉴Self语言,使用基于原型(prototype)的继承机制。

所以,JavaScript语言实际上是两种语言风格的混合产物(简化的)函数式编程+(简化的)面向对象编程。这是由Brendan Eich(函数式编程)与网景公司(面向对象编程)共同决定的。

不管怎么说,JavaScript和Java是有关系的,JavaScript里面有Java的思想。所以说JavaScript和Java无关是不正确的。

其实一直到现在Brendan Eich还是看不起讨厌Java。假如不是公司决策Brendan Eich绝对不会把Java作为JavaScript的设计原型,即使是现在,Brendan Eich还是讨厌自己的作品。他曾经说过:“与其说我爱JavaScript,不如说我恨它。它是C语言和Self语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:'它的优秀之处并非原创,它的原创之处并不优秀。”

我第一次接触JavaScript面向对象编程时候,是忍住刺痛和模糊看完的,那时只是猎奇,坚持看完也只不过是为了要保持良好的学习态度,而且当时对JavaScript有误解,觉得JavaScript面向对象编程是代码爱好者的游戏,使用价值不大,但是当我接触到一些优秀的JavaScript源码后我才发现,JavaScript面向对象编程用途是如此之多令我叹为观止,最后总结出一个结论:最好的JavaScript代码都应该是面向对象的。

那么JavaScript里是如何实现继承的?JavaScript的继承机制如何?

首先JavaScript里面没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototype chain)模式,来实现继承。

网景公司在发明与设计JavaScript的目标,其中很重要的两点:

1. 简易版的Java;

2. 简易,简易还是简易。

Brendan Eich设计JavaScript的时候引入了Java一个非常重要的概念:一切皆对象。既然JavaScript里面有了对象,那么设不设计继承就是困扰Brendan Eich的一个问题,如果真是要设计一个简易的语言其实可以不要继承机制,继承属于专业的程序员,但是JavaScript里那么多的对象,如果没有一种机制,他们之间将如何联系了,这必然会对编写程序的可靠性带来很大的问题,但是引入了继承又会使用JavaScript变成了完整的面向对象的语言,从而提高了它的门槛,让很多初学者望而却步,折中之下,Brendan Eich还是选择设计继承,但绝不是标准的继承(说道这里我想起了同样使用EMCAScript标准设计的语言ActionScript,它里面就有很完整的继承,做起来很惬意,我常想这是不是JavaScript以后的趋势,说不定哪天JavaScript会变的搄更完美写了?)。折中是指Brendan Eich不打算引入类(class),这样JavaScript至少看起来不像面向对象的语言了,那么初学者就不会望而却步了(这是欺骗啊,进来后倒腾死你,这就是所谓的关门打狗了)。

Brendan Eich思考之后,决定借鉴C++和java的new命令,将new命令引入了JavaScript,在传统的面向对象的语言里,new 用来构造实例对象,new 会调用构造函数,但是传统面向对象的语言new 后面的是类,内部机制是调用构造函数(constructor),而Brendan Eich简化了这个操作,在JavaScript里面,new 后面直接是构造函数,如是我们可以这么写一个Person类:

function Person(name)
{
	this.name = name;
}

var per = new Person('Brendan Eich');
console.log(per.name);//Brendan Eich

这样就创建了一个新的实例了。但是new有缺陷。用构造函数生成实例对象是无法无法共享属性和方法,例如下面代码:

function Person(name)
{
	this.name = name;
	this.nation = 'USA';
}

var per1 = new Person('Brendan Eich');
var per2 = new Person('IT民工');
per2.nation = 'China';
console.log(per1.nation);//USA
console.log(per2.nation);//China

每一个实例对象,都有自己的属性和方法的副本。这不仅无法做到数据共享,也是极大的资源浪费。和JavaScript工厂模式的缺点一样,过多重复的对象会使得浏览器速度缓慢,造成资源的极大的浪费。

考虑到这一点,Brendan Eich决定为构造函数设置一个prototype属性,这个属性都是指向一个prototype对象。下面一句话很重要:所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面。

实例对象一旦创建,将自动引用prototype对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。如是我们可以改写下上面的程序:

function Person(name)
{
	this.name = name;
}

Person.prototype = {nation:'USA'};

var per1 = new Person('Brendan Eich');
var per2 = new Person('IT民工');

console.log(per1.nation);//USA
console.log(per2.nation);//USA

当我们这样写程序时候Person.prototype.nation = 'China'; 所有实例化的类的nation都会变成China。

由于所有的实例对象共享同一个prototype对象,那么从外界看起来,prototype对象就好像是实例对象的原型,而实例对象则好像"继承"了prototype对象一样。prototype只是提供了实现JavaScript继承的一个很方便的途径和手段。

本文地址:http://www.nowamagic.net/librarys/veda/detail/114,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/114

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《重来:更为简单有效的商业思维》 贾森•弗里德(Jason Fried) (作者), 大卫•汉森(David Heinemeier Hansson) (作者), Mike Rohde (插图作者), 李瑜偲 (译者)

这本书呈现的是一种更好、更简单的经商成功之道。读完这本书,你就会明白为什么计划实际上百害而无一益,为什么你不需要外界投资人,为什么将竞争视而不见反倒会发展得更好。事实是你所需要的比你想象的少得多。你不必成为工作狂,你不必大量招兵买马,你不必把时间浪费在案头工作和会议上,你甚至不必拥有一间办公室。所有这些都仅仅是借口!

更多计算机宝库...