为什么80%的码农都做不了架构师?>>>
1、概要(Overview)
ECMAScript是一种基于对象的编程语言,用来在一个宿主环境(host environment)中演示计算指令,操作可计算对象。ECMAScript实际上只是一种脚本语言和语义的标准的定义,其本身并没有提供完全性的实现。在ECMAScript的官网定义中指出,希望ECMAScript的可计算环境(宿主环境)不但能够提供ECMAScript规范中所定义的对象和其它语言语法机制,最好还要能够提供特殊环境下的宿主对象(host object),这些对象的描述和行为可能会超出ECMAScript标准范围之外,只要它们能提供可被访问的属性和可以被ECMAScript程序调用的函数。
脚本语言(script language)是一种可以操作,自定义,自动控制“现有系统”(existing system)机制的语言。在这些系统中,通过用户界面可以利用一些已经存在的有用的功能,并且脚本语言则是通过程序控制的方式来展现那些功能的一种实现机制。在以上所描述的方式下,“现有系统”实际上是提供了由对象和功能组成的宿主环境,这些可以用来完善脚本的所有功能。脚本语言的面向的是可称之为专业或者非专业的程序开发者。
ECMAScript起先是被设计成网页脚本语言(Web scripting language),从而实现一种机制,可以在基于Web架构的客户机-服务器模式下的,可以使得浏览器端网页更加生动,同时完成类似服务器端计算。ECMAScript能够提供面向多种宿主环境所需的核心脚本功能(core scripting capacities),所以核心的脚本功能实在ECMAScript标准钟定义的,而不是在其它的宿主环境中。ECMAScript脚本的一些机制与一些其它的编程语言有些类似,尤其像java语言。
2、网页编程(Web Scripting)
Web浏览器提供了对于客户端计算所需要的ECMAScript宿主环境,包括:代表窗口(windows),菜单(menus),弹出窗口(pop-ups),对话框(dialog boxes),文本域(text-areas),锚(anchors),框架集(frames),历史记录(history),cookies,以及输入输出(input/output)。更进一步的是,浏览器还提供了把脚本代码和浏览器的事件进行绑定的机制,这些事件包括:焦点改变(changes of focus),网页和图片加载(page and image load),上传(uploading),错误和终止(error and abort),选择(selection),表单提交(form submission),鼠标动作(mouse actions)。脚本暴露在HTML文档中,显示的页面是用户界面元素的几何以及固定的和经过计算的文本和图片。脚本可以对用户的动作进行响应,并且这都不像其它的编程语言一样需要提供一个main方法。
Web服务器提供了对于服务器端计算所需要的不同的一种环境,包括了一些对象,例如:请求(requests),客户(clients),文件(files);以及锁定和共享数据的机制。通过综合运用客户端脚本和服务器端得脚本,可以方便的把计算任务分别分配客户端和服务器端,这样便为Web应用提供了传统用户界面。
支持ECMAScript的每一个客户端或者是服务器都提供了自己的宿主环境,来完善ECMAScript的执行环境(execution environment)。
3、语言概要(Language Overview)
下面是一些语言的常用预览。
ECMAScript是一种基于对象的:基本的语言和功能都是以对象的形式提供的,并且ECMAScript的编程就是通信对象(communicating objects)的集合。一个ECMAScript对象就是一组属性(properties)的集合(collections),每一个属性下面都会有零个或者多个特性(attributes)来决定该属性如何被使用,例如当一个属性的可写(Writable)特性的值被设为false后,任何想要改变此属性值的行为都将失效。属性(Properties)就像一个容器(containers)一样可容纳其它对象、基本数据(primitive values)、或函数。一个基本数据(a primitive value)是以下任意一种ECMAScript内建类型的值,这些内建类型包括Undefined、Null、Boolean、String、Number;一个对象(an object)是内建类型Object的值;一个函数(a function)是一个可调用的对象(callable object)。一个函数如果通过一个属性与一个对象关联之后则被称为方法(method)。
ECMAScript定义了内建对象类型的集合,来完成对ECMAScript实体的定义。这些内建对象包括:
全局对象(the global object);
对象的对象(the Object object);
函数对象(the Function obeject);
数组对象(the Array object);
字符串对象(the String 对象);
布尔对象(the Boolean object);
数值对象(the Number object);
数学对象(the Math object);
日期对象(the Date object);
正则表达式对象(the RegExp object);
Json对象(the JSON object);
错误对象(Error,EvalError, RangeError, ReferenceError, SyntaxError, TypeError and URIError.)
ECMAScript同样定义了一些列的内建的操作符(operators) ,此处不再重述,基本上操作符和其它编程一样(可参考C语言的操作符)。
ECMAScript的语言结构故意设计成类似Java的语法结构。这样,ECMAScript很容易就变成了一种易用的脚本语言。变量不必须要类型声明,函数的定义也不必须要在函数的调用之前。
对象(Objects)
ECMAScript没有像C++、Java、Smalltalk一样来使用类(use classes)。其对象的创建可以通过多种方式,可以通过对象字面量,或者通过构造函数调用执行代码并将参数传入完成对象的初始化。每个构造函数都是一个对象,并且拥有一个名为prototype的属性,该属性被用来实现原型继承(prototype-base inheritance)和共享属性(share propertes)。对象通过new关键字创建。例如:new Date(2009.11)创建了一个日期对象。在没有用new 关键字的情况下,直接调用构造函数,会依据不同的构造函数的定义产生相应的结果。例如:Date()的调用会产生一个当前日期和时间的字符串,而不是产生一个日期对象。
每个通过构造函数创建的对象都会在在内部隐含一个引用(implicit reference),这个引用指向的是对象构造函数的prototype属性。此外,一个prototype可能同样含有一个非空引用指向它自己的构造函数的prototype属性,这样层层迭代,便形成了所谓的“原型链”(prototype chain)。当为一个对象添加一个引用属性时(obj.propertyName = valueReference),这个引用会是原型链中同名属性的第一个值。换句话说,如果含有以上属性名称的对象调用该属性时,如果该对象本身有这个命名的属性,那么该属性就是最终的调用结构,否则该对象的prototype属性会被检查,看是否有该属性名,如果有则进行调用,之后层层迭代。
在一个基于类的(calss-based)面向对象的编程语言中,总体来说,状态(states)是包含在类的实例(instances)中的,方法(methods)是包含在类(class)中的,所以“继承”的只是结构(structure)和行为(behaviors)。在ECMAScript中,状态和方法包含在对象内,并且结构,行为以及状态都会被继承。所有的ECMAScript中的对象不直接包含同一个他们prototype对象所包含的所包含的属性和值,因为所有构造函数的prototype中的属性和值是被通过它所定义的对象所直接共享的。
此外,不像基于类定义对象的编程语言一样,ECMAScript中的对象的属性时可以动态的添加的,并且可以直接为所添加的属性赋值。
5、ECMaScript一些基本概念总结
对象(Object):
一个对象就是一组属性的集合,并且拥有单一的一个prototype对象,prototype对象可以为null值。
数据类型:
基本数据类型(primitive type):Number、String、Boolean、Null、Undefined
引用数据类型(reference type):Object、Array、Date、RegExp、Function
构造函数(constructor):能够创建和实例化对象的函数对象(Function object)。一个构造函数的prototype属性就是一个prototype对象,该对象用来实现继承和共享属性。
原型(prototype):为其它对象提供共享信息的对象。当一个构造函数创建一个对象时,那个被创建的对象会隐含一个指向该构造函数的一个引用类型的属性(_proto_),任意构造函数的prototype属性都可以被直接引用,引用的方式为:constructor.prototype;并且添加到构造函数的prototype对象的属性都可以被该构造函数所创建的所有实例共享。因为所有的实例都会共享构造函数的prototype属性。
本地对象(native object):ECMAScript实现中的对象,该实现的语义语法通过ECMAScript完全定义,而不是通过宿主环境。标准的本地对象都会在ECMAScript标准中定义,有些是内建的,其它的可能在ECMaScript程序的执行过程中北创建。
内建对象(build-in object):在ECMAScript实现中提供的,独立于任何宿主环境的。这些对象在任何ECMAScript程序执行之前已经定义。标准的内建对象都已在ECMAScript中定义,任何ECMAScript的实现,都可以指定和定义其它的内建对象。每个内建对象都是本地对象。内建的构造函数就是一个内建的对象,内建的对象也同样是一个构造函数(A built-in constructor is a built-in object that is also a constructor.)
宿主对象(hosted object):ECMAScript实现的宿主环境(hosted object)所提供的对象,用以完善ECMAScript的执行环境。
未定义值(Undefined value):当一个变量没有被指定值的时候,所使用的原书数据类型。
空值(null value):当一个对象未指定值时所使用的原始数据类型,
空类型(Null Type):所存储的值是null值的类型。
注:以上大部分内容为本人参考ECMAScript官方文档翻译而成,因水平有限可能存在理解上的偏差,感兴趣的朋友可以查看官方的原本英文文档。