我在读很多优秀的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类:

1 function Person(name)
2 {
3     this.name = name;
4 }
5  
6 var per = new Person('Brendan Eich');
7 console.log(per.name);//Brendan Eich

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

01 function Person(name)
02 {
03     this.name = name;
04     this.nation = 'USA';
05 }
06  
07 var per1 = new Person('Brendan Eich');
08 var per2 = new Person('IT民工');
09 per2.nation = 'China';
10 console.log(per1.nation);//USA
11 console.log(per2.nation);//China

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

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

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

01 function Person(name)
02 {
03     this.name = name;
04 }
05  
06 Person.prototype = {nation:'USA'};
07  
08 var per1 = new Person('Brendan Eich');
09 var per2 = new Person('IT民工');
10  
11 console.log(per1.nation);//USA
12 console.log(per2.nation);//USA

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

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

关于JavaScript诞生之初的趣事的更多相关文章

  1. Javascript诞生与历史

    基本常识 Brendan Eich在1995年4月入职Netscape Communications Corporation(网景通信公司).并于1995年5月用10天时间发明了Javascript. ...

  2. JS(JavaScript)的初了解(更新中···)

    1.js介绍 Js全称叫javascript,但不是java,他不仅是是一门前台语言,经过发展,现在也是一门后台语言:而java是后台语言. Js作者是布兰登艾奇. 前台语言:运行在客户端的 后台语言 ...

  3. Ajax异步与JavaScript的一些初浅认识

    向服务器请求数据的技术 有以下五种常用技术用于向服务器请求数据 XMLHttpRequest(XHR) Dynamic script tag insertion(动态脚本标签插入) iframes C ...

  4. Javascript诞生记 [转载]

    1. "1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览,不具备与访问者互动 ...

  5. JS(JavaScript)的初了解8(更新中···)

    1.函数都有返回值…… 而方法的本质也是函数,所以也有返回值. Document.getElementById() 返回的是获取的标签 getElementsByClassName()和getElem ...

  6. JS(JavaScript)的初了解7(更新中···)

    1.逻辑运算  ||   && ! 1||2   5&&4  !0 || 遇到第一个为true的数字就终止并返回 && 遇到第一个为false的值 就终 ...

  7. JS(JavaScript)的初了解6(更新中···)

    Js数据类型具体分析 基础类型:  string  number   boolean   null  undefined 引用类型:  object ==>  json  array  等 复习 ...

  8. JS(JavaScript)的初了解5(更新中···)

    1.函数 关键词function 首先,我们先复习一下前面的知识: var 是JS的关键字,用于声明变量,声明在内存模块完成,定义(=)是在执行模块完成. var可以在内存模块提前(JS代码执行前)完 ...

  9. JS(JavaScript)的初了解4(更新中···)

    1.JS的本质就是处理数据.数据来自于后台的数据库. 所以变量就起到一个临时存储数据的作用. ECMAScript制定了JS的数据类型. 数据类型有哪些? 字符串   String 数字    Num ...

随机推荐

  1. 富文本(wangEditor框架)的使用教程

    富文本的使用教程(wangEditor框架) 一,相信很多人用过很多富文本的框架,现在我向大家推荐一个很实用的一个富文本框架,具有丰富的功能项,容易使用. 所以本博客介绍这个富文本编辑器的使用哈!觉得 ...

  2. python常用模块目录

    博客目录总纲首页 python其他知识目录 random  hashlib  os  sys  json __name__ shutil  xlrd  xlwt   xlutils 核心模块:os s ...

  3. 【转】git乱码解决方案汇总

    git乱码解决方案汇 2012-11-04更新:官方的“终极”解决方案:msysGit1.7.10开始使用UTF-8编码保存文件名. 2011-10-24更新: 从一篇链接到本篇文章的文章(我对这篇文 ...

  4. 做一名合格的程序员(learning of a previous team)

    合格程序员的基本素质 作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该具 有的素质.  1 团队精神和协作能力 把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备 ...

  5. c++第七次作业____最后的总结

    先言: 在这过程中学到: 第二次作业Github的使用 第四次作业计算器的计算 ps:表达式处理以及计算 第五次作业文件的处理问题 第六次作业界面的设计 总结: 1.这学期的计算器,做的有点匆忙,偶尔 ...

  6. 在数组中找出两数之和为10的所有组合(JAVA)

    /*利用冒泡排序实现*/ import java.util.Scanner;public class Paixun { public static void main(String[] args) { ...

  7. Scrum项目6.0 和8910章读后感

    Scrum项目6.0总结 这次sprint1通过我们的努力,终于把自动回复做出来了.但之后的任务更加繁重,我们要更加努力,克服各种困难. 也要说说这次自动回复里面的注意之处: 1.不该空格的地方空格, ...

  8. WPF string,color,brush之间的转换

    String转换成Color string-"ffffff" Color color = (Color)ColorConverter.ConvertFromString(strin ...

  9. lr基本的概念

    并发用户数量:与服务器进行交互的在线用户数量   请求响应时间:从client端发出请求到得到响应的整个时间,它一般包括网络相应时间+server的响应时间   事务请求响应时间:完成这个事务所用的时 ...

  10. scrapy-继承默认的user-agent 中间件

    class MyUserAgentMiddleware(UserAgentMiddleware): def __init__(self, user_agent): self.user_agent = ...