ECMA-262第五版 概述
4.概述
本节包含了ECMAScript语言的非规范性的概述。
ECMAScript是一种面向对象(object-oriented)的编程语言,用于执行计算和操作在宿主环境中的计算机对象。这里定义的ECMAScript没有被设计为能够自给自足的计算,事实上,在本说明中,没有对要输入的外部数据和要输出的计算结果作出任何规定,相反,我们期望的计算环境是在本说明中描述的ECMAScript程序提供的那些不限于对象和其他的设施,而且,也有一些特别的环境,如宿主对象,对它的描述及行为都超过了本说明的范围,不过,可以知道的是,它们可能会提供一些可以由ECMAScript程序访问的属性和调用的函数。
脚本语言是用来操作、控制一个已经存在的系统的资源的编程语言。在这样的系统中,有用的功能已经通过用户接口提供了,脚本语言只是提供控制这些功能的一个机制。按这种方式,这个已经存在的系统叫做宿主,他提供宿主对象和资源。脚本语言可以被专业和非专业的程序员使用。
ECMAScript最开始的设计是为一门web脚本语言,让web页面显示更生动,并且使客户端能做一些服务器端的计算工作。 ECMAScript能够为一些宿主环境提供核心的脚本功能,因此,核心的脚本语言是在这个文件中指定任何特定的脚本功能除了宿主环境。
ECMAScript 和一些语言很相似,特别是java , Self, 和Scheme。这些语言的概括:
Gosling, James, Bill Joy and Guy Steele. The Java ™ Language Specification. Addison Wesley Publishing Co., 1996.
Ungar, David, and Smith, Randall B. Self: The Power of Simplicity. OOPSLA '87 Conference Proceedings, pp. 227-241, Orlando, FL, October 1987.
IEEE Standard for the Scheme Programming Language. IEEE Std 1178-1990.
4.1web脚本
网页浏览器提供给ECMAScript一个客户端的宿主环境,包括windows,menus,menus, pop-ups, dialog boxes, text areas, anchors, frames, history, cookies, 和input/output。而且宿主提供操纵脚本去触发事件的功能,例如改变聚焦、页面和图片加载、卸载、提示错误、中断、选择、提交和鼠标操作。脚本代码嵌在HTML中,而显示的页面是一个用户界面元素,文本和图片的集合体。脚本操作它们,但是并不需要主程序(指不需要main函数)。
web服务器为服务器端的计算提供了另外一个宿主环境,它包括提交请求对象,客户端对象和文件对象,并能够锁住和共享数据,通过使用服务端和客户端的脚本合用,使得web程序能够提供客户定制的用户界面。
所有支持ECMAScript的web浏览器和服务器都提供自己的宿主环境供ECMAScript运行。
4.2语言概述
下面是对ECMAScript非正式的描述—对这个语言所有部分的描述。这个概述不是标准的一部分。
ECMAScript是基于对象的语言:语言的基本部分和宿主设施由对象提供,ECMAScript程序是一组可通信的对象。ECMAScript对象都是都是未排序的属性集合,另个或者多个特征来分别其中各属性应如何使用—举例,当某个属性特征Writable(可写)设为false时,任何通过执行ECMAScript代码来改变这个属性的值都不会生效。属性是装载其他对象的容器,如原始值(primitive values)或者函数(functions)。原始值是下列内置类型的一个成员:未定义(Undefined)、空值(Null)、布尔值(Boolean)、数值(Number)、字符串(String);一个对象是保持内置类型对象的一个成员;方法是一种通过属性来访问对象的函数。
ECMAScript定义了一集勾勒出ECMAScript定义实体的内置对象,这内置对象包括global对象、Object对象、Function对象、数组对象、String对象、Boolean对象、Number对象、Math(数据库)对象、Date对象、RegExp(正则表达式)对象、JSON对象、Error类对象: Error 、EvalError(求值错误)、RangeError(越界错误)、ReferenceError(引用错误)、SyntaxError(语法错误)、TypeError(类型错误)、 URIError(唯一资源定位符错误)。
ECMAScript也定义了一个内置运算符的集合。ECMAScript包含了各种各样的操作:乘法运算符、加法运算符、位移运算符、关系运算符、相等关系运算符、二元操作运算符、二元逻辑运算符、分配运算符、逗号运算符。
ECMAScript特意设计成和java的语法类似。ECMAScript的语法设计能使其作为一种易于使用的脚本语言提供服务。例如一个变量不需要拥有自己的类型声明或与其关联的属性类型,定义函数时不需要在他们被调用的上文中出现他们的声音。
4.2.1 对象
ECMAScript没有严格意义上的类,不像C++, Smalltalk, Java。作为代替,它支持构造函数,利用它,可通过执行代码创建对象:给对象分配存储,然后通过赋初始值来初始化对象属性的全部或部分。所有的构造函数都是对象,但并非所有的对象都是构造函数。每一个构造函数都有一个“prototype”原型属性,被用于实现原型继承(prototype-based inheritance)和共享属性(shared properties)。使用构造函数来创建对象要用new表达句;例如,new Date(2009,11)创建了一个新的日期对象。不适用new调用构造函数的后果取决于这个构造函数本身。例如,Date()产生一个字符串而非对象。
每一个构造函数都有一个相关联的原型,他创建的所有对象都拥有一个隐含的应用指向那个与其构造函数相关联的原型(所谓的对象的原型)。而且,一个原型可能拥有到他原型的隐含非空的引用等等,这被称为原型链。若为某对象中的一个属性创建引用,那么此引用指向该对象的原型链中,最先拥有同名属性的对象所包含的这个属性。换句话说,首先检查被提及的对象是否包含某个属性;如果那个对象包含同名的属性,被引用指向的就是这个属性;如果那个对象不包含同名的属性,检查他的原型,如此继续下去。
通常,在基于类的面向对象的语言中,实例装载状态,类装载方法,继承的仅仅是结构和行为。而在ECMAScript中,状态和方法均由对象装载,且结构、行为、状态都会被继承。
所有没有直接包含某个他们的原型链所包含的特定属性的对象,与他们的原型共享那个属性和他的值。下面的图标阐述了一切:
CF是一个构造函数(也是一个对象)。使用new表达式创建了5个对象:cf1、cf2、cf3、cf4、cf5。每个对象都包含属性q1和q2.虚线表示隐含的原型关系,比方说,cf3的原型是cfp.构造函数CF有两个属性P1和P2,他们对于CFp, cf 1, cf 2, cf 3, cf 4, or cf 5是不可见。CFp中名为CFP1的属性被cf 1, cf 2, cf 3, cf 4, and cf 5共享(除CF),这样,CFp的隐含原型链中所有属性没有名为q1、q2或cfp1的。需要注意的是CF和cfp之间没有隐含的原型链。
不像基于类的面向对象的语言,属性可以通过给他们赋值的方式,把他们动态添加给对象。也是说,构造函数不需要给所构造的对象的全部或者部分属性命名或赋值。在上面的图表中,通过给cpf中的属性赋新值就可以给f 1, cf 2, cf 3, cf 4, cf 5添加新的共享属性。
本节包含了ECMAScript语言的非规范性的概述。
ECMAScript是一种面向对象(object-oriented)的编程语言,用于执行计算和操作在宿主环境中的计算机对象。这里定义的ECMAScript没有被设计为能够自给自足的计算,事实上,在本说明中,没有对要输入的外部数据和要输出的计算结果作出任何规定,相反,我们期望的计算环境是在本说明中描述的ECMAScript程序提供的那些不限于对象和其他的设施,而且,也有一些特别的环境,如宿主对象,对它的描述及行为都超过了本说明的范围,不过,可以知道的是,它们可能会提供一些可以由ECMAScript程序访问的属性和调用的函数。
脚本语言是用来操作、控制一个已经存在的系统的资源的编程语言。在这样的系统中,有用的功能已经通过用户接口提供了,脚本语言只是提供控制这些功能的一个机制。按这种方式,这个已经存在的系统叫做宿主,他提供宿主对象和资源。脚本语言可以被专业和非专业的程序员使用。
ECMAScript最开始的设计是为一门web脚本语言,让web页面显示更生动,并且使客户端能做一些服务器端的计算工作。 ECMAScript能够为一些宿主环境提供核心的脚本功能,因此,核心的脚本语言是在这个文件中指定任何特定的脚本功能除了宿主环境。
ECMAScript 和一些语言很相似,特别是java , Self, 和Scheme。这些语言的概括:
Gosling, James, Bill Joy and Guy Steele. The Java ™ Language Specification. Addison Wesley Publishing Co., 1996.
Ungar, David, and Smith, Randall B. Self: The Power of Simplicity. OOPSLA '87 Conference Proceedings, pp. 227-241, Orlando, FL, October 1987.
IEEE Standard for the Scheme Programming Language. IEEE Std 1178-1990.
4.1web脚本
网页浏览器提供给ECMAScript一个客户端的宿主环境,包括windows,menus,menus, pop-ups, dialog boxes, text areas, anchors, frames, history, cookies, 和input/output。而且宿主提供操纵脚本去触发事件的功能,例如改变聚焦、页面和图片加载、卸载、提示错误、中断、选择、提交和鼠标操作。脚本代码嵌在HTML中,而显示的页面是一个用户界面元素,文本和图片的集合体。脚本操作它们,但是并不需要主程序(指不需要main函数)。
web服务器为服务器端的计算提供了另外一个宿主环境,它包括提交请求对象,客户端对象和文件对象,并能够锁住和共享数据,通过使用服务端和客户端的脚本合用,使得web程序能够提供客户定制的用户界面。
所有支持ECMAScript的web浏览器和服务器都提供自己的宿主环境供ECMAScript运行。
4.2语言概述
下面是对ECMAScript非正式的描述—对这个语言所有部分的描述。这个概述不是标准的一部分。
ECMAScript是基于对象的语言:语言的基本部分和宿主设施由对象提供,ECMAScript程序是一组可通信的对象。ECMAScript对象都是都是未排序的属性集合,另个或者多个特征来分别其中各属性应如何使用—举例,当某个属性特征Writable(可写)设为false时,任何通过执行ECMAScript代码来改变这个属性的值都不会生效。属性是装载其他对象的容器,如原始值(primitive values)或者函数(functions)。原始值是下列内置类型的一个成员:未定义(Undefined)、空值(Null)、布尔值(Boolean)、数值(Number)、字符串(String);一个对象是保持内置类型对象的一个成员;方法是一种通过属性来访问对象的函数。
ECMAScript定义了一集勾勒出ECMAScript定义实体的内置对象,这内置对象包括global对象、Object对象、Function对象、数组对象、String对象、Boolean对象、Number对象、Math(数据库)对象、Date对象、RegExp(正则表达式)对象、JSON对象、Error类对象: Error 、EvalError(求值错误)、RangeError(越界错误)、ReferenceError(引用错误)、SyntaxError(语法错误)、TypeError(类型错误)、 URIError(唯一资源定位符错误)。
ECMAScript也定义了一个内置运算符的集合。ECMAScript包含了各种各样的操作:乘法运算符、加法运算符、位移运算符、关系运算符、相等关系运算符、二元操作运算符、二元逻辑运算符、分配运算符、逗号运算符。
ECMAScript特意设计成和java的语法类似。ECMAScript的语法设计能使其作为一种易于使用的脚本语言提供服务。例如一个变量不需要拥有自己的类型声明或与其关联的属性类型,定义函数时不需要在他们被调用的上文中出现他们的声音。
4.2.1 对象
ECMAScript没有严格意义上的类,不像C++, Smalltalk, Java。作为代替,它支持构造函数,利用它,可通过执行代码创建对象:给对象分配存储,然后通过赋初始值来初始化对象属性的全部或部分。所有的构造函数都是对象,但并非所有的对象都是构造函数。每一个构造函数都有一个“prototype”原型属性,被用于实现原型继承(prototype-based inheritance)和共享属性(shared properties)。使用构造函数来创建对象要用new表达句;例如,new Date(2009,11)创建了一个新的日期对象。不适用new调用构造函数的后果取决于这个构造函数本身。例如,Date()产生一个字符串而非对象。
每一个构造函数都有一个相关联的原型,他创建的所有对象都拥有一个隐含的应用指向那个与其构造函数相关联的原型(所谓的对象的原型)。而且,一个原型可能拥有到他原型的隐含非空的引用等等,这被称为原型链。若为某对象中的一个属性创建引用,那么此引用指向该对象的原型链中,最先拥有同名属性的对象所包含的这个属性。换句话说,首先检查被提及的对象是否包含某个属性;如果那个对象包含同名的属性,被引用指向的就是这个属性;如果那个对象不包含同名的属性,检查他的原型,如此继续下去。
通常,在基于类的面向对象的语言中,实例装载状态,类装载方法,继承的仅仅是结构和行为。而在ECMAScript中,状态和方法均由对象装载,且结构、行为、状态都会被继承。
所有没有直接包含某个他们的原型链所包含的特定属性的对象,与他们的原型共享那个属性和他的值。下面的图标阐述了一切:
![]() |
ECMA第五版 原型链 |
CF是一个构造函数(也是一个对象)。使用new表达式创建了5个对象:cf1、cf2、cf3、cf4、cf5。每个对象都包含属性q1和q2.虚线表示隐含的原型关系,比方说,cf3的原型是cfp.构造函数CF有两个属性P1和P2,他们对于CFp, cf 1, cf 2, cf 3, cf 4, or cf 5是不可见。CFp中名为CFP1的属性被cf 1, cf 2, cf 3, cf 4, and cf 5共享(除CF),这样,CFp的隐含原型链中所有属性没有名为q1、q2或cfp1的。需要注意的是CF和cfp之间没有隐含的原型链。
不像基于类的面向对象的语言,属性可以通过给他们赋值的方式,把他们动态添加给对象。也是说,构造函数不需要给所构造的对象的全部或者部分属性命名或赋值。在上面的图表中,通过给cpf中的属性赋新值就可以给f 1, cf 2, cf 3, cf 4, cf 5添加新的共享属性。