《JavaScript专家编程》——第1章 对象和原型 1.1鸟瞰JavaScript

第1章 对象和原型

练习不会造就完美,只有使用最佳的方法来练习才能造就完美。

——Vince Lombardi

对专家来说,把JavaScript的核心概念讲上3章似乎有点多,毕竟这些是语言最基本的组成部分。我的主张是,有的人虽然不能读写,但可以说话。就像有的开发人员对JavaScript的基本功能很熟悉,但对里面那些复杂的东西可能就没那么了解了。

本书的目标是像明灯一样照亮语言中那些晦涩的角落。里面包含的很多概念你可能已经试着学习过了,甚至可以假设你已经理解了。这里可以想象一下:你正降落到你大脑中储存着JavaScript的那一个房间。本书可以被看作是一盏探照灯,用来检查你的JavaScript根基中那些有裂纹的地方。本章和下面的章节是用来弥补你的JavaScript知识漏洞的。不要觉得回顾这些知识没用,这其实是对JavaScript知识结构的重新梳理。

我会先高度概括一下JavaScript的语言目标。但你知道它之前,放平你的肚子,匍匐穿过JavaScript中那些鲜为人知的概念。我会首先详细介绍跟对象和原型相关的重要思想,然后在接下来的章节中介绍函数和闭包,这些都是JavaScript的基础。

1.1 鸟瞰JavaScript

我们所说的JavaScript实际上是ECMAScript语言规范的一个实现。JavaScript若想被看作实现ECMAScript规范的一个有效版本,它必须支持规范中定义的语法和语义。作为ECMAScript的实现,JavaScript必须给程序员提供可使用的多种类型(types)、属性(properties)、值(values)、函数(funtion)和一些保留字(reserved words)。

一旦JavaScript的某个版本已经符合了ECMAScript规范,那么语言设计者就可以自由地对版本进行加强,加入他们认为合适的额外功能和方法。ECMAScript规范中明确说明允许这样的扩展,正如下面读到的:

符合标准的ECMAScript实现,允许提供超出本规范描述的额外类型、值、对象、属性和函数。尤其是本规范中描述的对象,允许提供未在本规范中描述的属性和值。一个合乎ECMAScript规范的实现允许加入没有在规范中描述的程序语法和正则表达式语法。

在ECMAScript中,一些额外的特性可以与核心要素并行存在,但仍然被认为是一种有效的ECMAScript标准的实现,这是ECMAScript标准组织发展的一个标志。ECMAScript对特性的要求比较宽泛,这带来了一些好处但也有弊端。虽然灵活地添加新功能,可以鼓励语言设计者的创新,但也会让开发者处于一个不利的状况:他们会为了支持不同的实现和运行环境而写一些代码(polyfills)1。

ECMAScript的规范会因为各种不同原因(原因太多,不一一列举)不断变化。根本上讲,这些变化是为了使用新的方法来解决老的问题,或者用于支持在巨型计算生态系统中的改进。而不断变化的规范就形成了语言的逐步进化。因此,虽然我要讲的是“核心概念”,它们听起来是不变的,但其实并非如此。本章探讨的概念是那些最基本和重要的,但不要忘记,时刻要准备应对新变化的到来。

脚本设计
正如其名称所示,ECMAScript是脚本语言,使用程序化的方式与主机环境进行交互。无论是浏览器、服务器或单片机,都可以为JavaScript暴露一些可操作的接口。大多数宿主环境仅允许JavaScript去触发那些本来用户就可以操作的功能(虽然用户是手动的)。例如,在浏览器中,用户可以使用鼠标或手指在网页链接上单击,JavaScript则可以用程序的形式完成单击的操作,如下所示:

从传统观念上讲,ECMAScript几乎专门被设计成一种工具,用于在浏览器中编写网络脚本。开发人员用它来提升浏览网页时的用户体验。如今,ECMAScript能用于服务器上,就像它被应用到浏览器中一样,这一切归功于V8或TraceMonkey这样的独立引擎。

ECMAScript标准组织预见到开发人员使用JavaScript的传统方式和它目前成长的领域非常不一样。在最近的规范中它聪明地界定了什么是“网络脚本”,同时列举了两个当下比较流行的应用情境。

Web浏览器为ECMAScript在客户端的运行提供了宿主环境,它封装了一系列对象供ECMAScript使用,包括窗口、菜单、弹窗、对话框、文本区域、锚点、多窗口的页面、历史、cookie和输入/输出对象。此外,宿主环境提供了一种方式,将脚本代码附着在事件上,例如焦点的改变,页面和图像的加载、卸载,错误和中断,选择,表单提交和鼠标操作。含有脚本代码的HTML和被显示的页面是一种组合,脚本代码提供用户接口,而显示页面则提供静态或动态的文字和图片。脚本代码用于响应用户交互,也就不必要有个主程序了。

Web服务器为服务端的计算提供了不同的宿主环境,包括代表请求、客户端和文件的对象,还包括锁定以及共享数据的机制。在浏览器和服务端同时使用脚本语言,使得将计算逻辑分布到客户端和服务端的同时能为基于Web的应用提供定制化的用户接口。

每个支持ECMAScript的Web浏览器和服务器,都需要有满足ECMAScript运行的宿主环境。


 在作者写作本书时,最新版本的ECMAScript 6(命名为“Harmony”)已经快要发布了,虽然还没有官方发布,但许多提案修改已经被一些运行时引擎和浏览器支持了。本章会对语言的核心进行详尽说明,其中也包括一些在“Harmony”中刚刚引入的新特性。如果某个特性还没有被大范围支持,我会特别提醒读者注意。

时间: 2024-12-04 23:27:15

《JavaScript专家编程》——第1章 对象和原型 1.1鸟瞰JavaScript的相关文章

《JavaScript专家编程》——1.2 对象概述

1.2 对象概述 JavaScript是由Brendan Eich创建的一种面向对象编程(OOP)语言,当时他还在Netscape公司工作,花了几周的开发时间就发布了.虽然JavaScript的名字中有个"Java",但它实际上跟Java语言没什么关系.在InfoWorld的一篇对Eich的采访稿中,他解释了JavaScript命名的由来: InfoWorld:据我所知,JavaScript开始的时候叫Mocha,后来改名叫LiveScript,在 Netscape和Sun合并以后才叫

《JavaScript专家编程》——导读

**前言**在我看来,好的技术书籍是磁带.藏宝图和现场札记内容的混合体.本书就是我灌注了很多心血而将这些不同形式融为一体的一本书. 老一辈的人还记得,磁带内容是由很多歌曲组成的.这些磁带经常被作为礼物送给朋友.恋人.人们会挑选一些个人喜欢的歌,或者围绕某个主题组织在一起的歌,录入这盘磁带中.通常,当听磁带的人听到这些歌时,这些歌就会勾起人们对录制者的记忆.这本书就是一盘我录给你们的JavaScript方面的磁带.这些章节包括JavaScript中我喜欢的一些方面,也包括不容易被理解的主题,因为这

《JavaScript专家编程》——第9章 代码质量 9.1 定义代码质量

第9章 代码质量 质量不是一种行为,而是一种习惯. --Aristotle 写高质量的JavaScript是什么意思?质量能度量吗?还是说它是一个主观感受,类似于美和艺术的柏拉图式的理想?程序员往往会在质量的主观和客观理解之间摇摆不定.他们提出了诸如软件工艺的概念,这是一种用类似手工艺的方法来编写软件的方式.软件工匠常被这样描述:他们拥有超群的技术,总是能将工作提炼为基本的.本质的部件.这样一个工匠在电气上被称为摇滚明星程序员.这基于两个标准,一是这个人具有如同艺术家一样的独特天赋,二是他工作的

《JavaScript专家编程》——9.4 度量JavaScript代码质量

9.4 度量JavaScript代码质量 为了让计算精度上升到最高,客观质量分析以程序化的方式对代码进行分析.这项任务可以使用编程工具完成,这些工具能够在多种情况下评估代码,根据各项指标得到最终的质量得分.本节介绍了静态代码分析,这种方法非常适合评估JavaScript的质量. 静态代码分析 静态代码分析就是不通过运行代码来分析代码的过程.静态分析看起来非常像一个文本编辑器的拼写检查器.拼写检查器扫描文档的正文来寻找错误和含糊之处,而并不需要了解文本的意义.同时,静态代码分析从功能上分析源代码的

《JavaScript专家编程》——1.3 小结

1.3 小结 对象是持有零个或多个属性的包. 对象的属性要么是基本类型,要么是复杂类型.对象可以持有它们自己的基本类型的拷贝,但仅能持有复杂类型的引用.出于这个原因,JavaScript的属性要么传引用,要么传值. 对象的属性可以有标记符,可以在修改对象时,控制对象的行为和能力. 对象可以通过以下三种方式之一创建. 使用字面量语法'{}'. 联合使用new运算符和构造函数,例如'new Foo()'. 使用内置的Object.create()函数. JavaScript是一种基于原型的语言,对象

javascript面向对象编程之一 万物皆对象

javascript几乎成了如今web开发人员必学必会的一门语言,但很多人却只停在了一些表单验证等基础操作层面上,在面向对象语言大行其道的当下,我们需要去学习javascript的面向对象的知识,以便更好的掌握javascript.为深入理解各种脚本框架打好基础. javascript和java.C#等语言一样也具有面向对象的一些特征,但细比较的时候,会发现这些特征并不是真正的面向对象,很多地方都是利用对象本身来模拟面向对象,所以认为javascript不能算是面向对象编程语言,而是基于对象的语

《JavaScript专家编程》——9.5 小结

9.5 小结 本章介绍了JavaScript代码质量的必要性及其原因.一个程序的质量往往会影响程序员维护.改进甚至是否有能力完全了解源代码.质量差的代码通常被称为技术债,剥夺了项目的时间和资源,而这些时间和资源用在其他地方能更好地发挥作用.然而,编程往往是一门跨越了艺术和科学之间的学科,这使得对质量的定义变的更为复杂.而且,质量又是从主观和客观上的双重度量. 有这样一种观点认为,一个人所在时代的文化,以及他们的个人经历都会对质量产生影响.这种观点将质量描述为具有"内在卓越"的东西,只有

《JavaScript专家编程》——9.2 如何度量质量

9.2 如何度量质量 你正在为质量寻找一个可用的定义,但因为它们涉及到编程,所以需要首先考虑它的各个方面.通常会将这些方面表示为软件度量: 软件度量是一个软件在某些属性或其规格上的度量.由于定量度量在所有科学中都是必不可少的,因此计算机科学从业者和理论家通过不断努力,将类似的方法引入软件开发中.我们的目标是获得客观的.可重复的和可量化的度量,这可能包含很多有价值的实践,包括进度规划.预算规划.成本估算.质量保证测试.软件调试.软件性能优化以及人员任务分配优化. 我已经努力总结出六个指标,来度量代

《JavaScript专家编程》——9.3 为什么要度量代码质量

9.3 为什么要度量代码质量 "我不能为代码质量而索价."这是我问我的朋友关于这个问题的想法时,他的原话.他的意思是,代码质量主要是对程序员有利,而对客户来说是一种无形的税收.我能理解他的观点:我有几次经验,其中一个潜在客户将目光投向了我引以为傲的有关测试的方法论上.我的朋友接着说,"客户支付的是结果,而不是过程.当我买票到西南部,我付的钱是为了到达我的目的地,而不是为了乘坐飞机."这句话听起来好像有点道理,但我会在这一节讨论度量代码质量并不会让你失去竞争优势, 而