JavaScript的历史

一、JavaScript的诞生

1994年,网景公司(Netscape)发布了Navigator浏览器0.9版。这是历史上第一个比较成熟的网络浏览器

特点:只能用来浏览,不具备与访问者互动的能力,一切都需要服务器端进行判断

需求:需要一种网页脚本语言,使得浏览器可以与网页互动

时代:1.1994年正是面向对象编程最兴盛的时期,Brendan Eich受到影响,使JavaScript里面所有的数据类型都是对象,同时他考虑是否要设计“继承”机制
2.1995年Sun公司将Oak语言改名为Java,正式向市场推出,并大肆宣传,看上去很可能成为未来的主宰;网景公司动心,决定与Sun公司结盟,当时的形势就是,网景公司的整个管理层,都是Java语言的信徒,Sun公司完全介入网页脚本语言的决策。因此,Javascript后来就是网景和Sun两家公司一起携手推向市场的,这种语言被命名为"Java+script"并不是偶然的。
3.1995年5月,网景公司做出决策,未来的网页脚本语言必须"看上去与Java足够相似",但是比Java简单,使得非专业的网页作者也能很快上手。Brendan Eich被指定为这种"简化版Java语言"的设计师。

二、Brendan Eich的选择

考虑到JavaScript里面都是对象,必须有一种机制,将所有对象联系起来,所以,他最后还是设计了“继承”。

为了减少初学者入门难读,他并未引入“类”的概念。

考虑到C++和Java语言都是用new命令,生成实例,于是他就把new命令引入了JavaScript,用来从原型对象生成一个实例对象。

ClassName *object = new ClassName(param); // C++

Foo foo = new Foo(); // Java

但是,JavaScript并没有“类”,如何表示原型对象呢?

此时,他想到C++和Java使用new命令时,都会调用“类”的构造函数,因此他做了一个简化的设计,在JavaScript语言中,new命令后面跟的不是类,而是构造函数。

function DOG(name) {   // DOG构造函数,表示狗对象的原型
  this.name = name; 
}   
var dogA = new DOG('大毛');  // new 构造函数,生成一个狗对象的实例 
alert(dogA.name);  // 大毛

三、new运算符的缺点

用构造函数生成实例对象,有一个缺点:无法共享属性和方法。

function DOG(name) { 
  this.name = name; this.species = '犬科'; 
}   
var dogA = new DOG('大毛'); 
var dogB = new DOG('二毛');   
dogA.species = '猫科'; 
alert(dogB.species);  // 犬科

我们在DOG对象的构造函数中设置了共有属性species,当修改实例对象中的一个,另一个并不会受到影响,每一个实例对象都有着自己的属性和方法的副本。

这样就无法做到数据共享,造成了资源的浪费。

❣构造函数中的this代表了新创建的实例对象

四、prototype属性的引入

因此,Brendan Eich决定为构造函数设置一个prototype属性。

这个属性包含一个对象,所有实例对象需要共享的属性和方法,都放在这个对象里面,而不需要共享的属性和方法,就放在构造函数里面。

实例对象一旦创建,将自动引用prototype对象的属性和方法,即,实例对象的属性和方法分为两种:本地+引用

function DOG(name) {  
  this.name = name; 
} 
DOG.prototype = { species:'犬科' };   
var dogA = new DOG('大毛'); 
var dogB = new DOG('二毛');   
alert(dogA.species); // 犬科 
alert(dogB.species); // 犬科   

DOG.prototype.species = '猫科';   
alert(dogA.species); // 猫科 
alert(dogB.species); // 猫科

两个实例对象共享prototype对象中的属性,只要修改了prototype对象,就会同时影响到两个实例对象。

由于所有的实例对象共享同一个prototype对象,则prototype对象就好像是实例对象的原型,而实例对象则好像是“继承”了prototype对象一样。

五、JavaScript的10个设计缺陷

-前言:为什么有设计缺陷?

1.设计阶段过于仓促(仅仅10天,设计师仅为了交差,本人并不愿意这样设计;且设计初衷就是为了解决一些简单的网页互动,并没有考虑复杂应用的需要)

2.没有先例可以参考(JavaScript同时结合了函数式编程和面向对象编程的特点,这可能是历史上的第一例,直至目前,JavaScript仍是世界上唯一使用prototype继承模型的主要语言)

3.过早的标准化(JavaScript退出一年半之后,国际标准就问世了。设计缺陷还没有充分暴露就成了标准)

-10个设计缺陷

1.不适合开发大型程序

JavaScript咩有名称空间,很难模块化???

没有如何将代码分布在多个文件的规范

允许同名函数的重复定义,后面的定义可以覆盖前面的定义,很不利于模块化加载

2.非常小的标准库

标准函数库非常小,只能完成一些基本操作,很多功能并不具备

3.null和undefined

null属于对象的一种,意思为该对象为空;

undefined是一种数据类型,表示未定义;

typeof null; // object 
typeof undefined; //undefined   
var foo; 
foo == null ; // true 
foo == undefined; // true 
foo === null; // false 
foo === undefined; // true

4.全局变量难以控制

JavaScript的全局变量,在所有模块中都是可见的;

任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性;

5.自动插入行尾分号

JavaScript的所有语句,都必须以分号结尾,但是如果忘记加,编译器也不会报错,而是自动为你加上,这使得一些错误很难发现

6.加号运算符

+有两个含义

数字与数字的和 1+1 // 2

字符与字符的连接 "1"+"10" // 110 1+"10" // 110

7.NaN

NaN是一种数字,表示超出了解释器的极限,有一些奇怪的特性

NaN === NaN; // false 
NaN !== NaN; // true 
console.log(1+NaN); // NaN

8.数字和对象的区分

由于JavaScript的数组也属于对象,所以要区分一个对象到底是不是数组,相当麻烦

if ( arr &&  typeof arr === 'object' && typeof arr.length === 'number' && !arr.propertyIsEnumerable('length')){   
alert("arr is an array");  
}

9.==和===、

==用来判断两个值是否相等,当两个值的类型不同时,会发生自动转换

=== 需要两个值和类型都相同

10.基本类型的包装对象

JavaScript有三种基本数据类型:字符串、数字和布尔值;他们都有相应的构建函数,可以生成字符串对象、数字对象和布尔值对象

new Boolean(false);   
new Number(1234);   
new String("Hello World");   
alert( typeof 1234); // number   
alert( typeof new Number(1234)); // object

参考

1.Javascript继承机制的设计思想---阮一峰

2.Javascript诞生记---阮一峰

3.Javascript的10个设计缺陷---阮一峰

4.《JavaScript高级程序设计》(第四版)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容