对象初始化(英文来源:ECMAScript-262 第五版)
(黄底为评注或补缺)
对象初始化是一个以直接量的方式描述对象的初始化过程的表达式。它是用花括号括起来的由零或者多对属性名 / 关联值组成的列表,值不需要是直接量,每次对象初始化被执行到时他们会执行一次。
语法:
ObjectLiteral :
{ }
{ PropertyNameAndValueList }
{ PropertyNameAndValueList , }//ECMA-262 中并未禁止末尾添加逗号!
PropertyNameAndValueList : PropertyAssignment PropertyNameAndValueList , PropertyAssignment
PropertyAssignment : PropertyName : AssignmentExpression get PropertyName ( ) { FunctionBody } set PropertyName ( PropertySetParameterList ) { FunctionBody }
PropertyName : IdentifierName StringLiteral NumericLiteral
PropertySetParameterList :
Identifier
语义:
产生式 ObjectLiteral: { } 按照下面的过程执行 :
- 如同以表达式 new Object() 创建新对象并将该对象返回,其中Object 是标准的内置构造器。
产生式 s ObjectLiteral: { PropertyNameAndValueList} 以及ObjectLiteral: {PropertyNameAndValueList ,} 按照下面的过程执行 :
- 返回解释执行 PropertyNameAndValueList 的结果。
产生式 PropertyNameAndValueList: PropertyAssignment 按照下面的过程执行 :
- 令 obj 等于一个新创建的对象,就如同使用 new Object() 创建一个新对象一样,其中 Object 是一个标准的内置构造器。//并不是使用 new Object() 创建对象,而是以某种方式获得一个新对象,但返回的结果和使用 new Object() 一致.
- 令 propId 为解释执行 PropertyAssignment 的结果。
- 以参数 propId.name、propId.descriptor 和false 调用obj 的[[DefineOwnProperty]] 内置方法。
- 返回 obj。
产生式 PropertyNameAndValueList: PropertyNameAndValueList,PropertyAssignment按照下面的过程执行 :
- 令 obj 为解释执行 PropertyNameAndValueList 的结果。//obj此时仍是临时对象,并未返回,所以在字面量代码的其他地方不能访问obj,this也不指向obj.
- 令 propId 为解释执行 PropertyAssignment 的结果。
- 令 previous 为以参数 propId.name 调用 obj 的[[GetOwnProperty]] 内置方法的结果。
- 如果 previous 不是 undefined,且当以下任意一个条件为 true 时,则抛出一个SyntaxError 异常:
- 产生式包含在严格模式下并且IsDataDescriptor(previous) 为true 并且IsDataDescriptor(propId.descriptor) 为true。
- IsDataDescriptor(previous) 为true 并且IsAccessorDescriptor(propId.descriptor) 为true。
- IsAccessorDescriptor(previous) 为true 并且IsDataDescriptor(propId.descriptor) 为true。
- IsAccessorDescriptor(previous) 为true 并且IsAccessorDescriptor(propId.descriptor) 为true 并且previous 和propId.descriptor 都有[[Get]] 字段或者previous 和propId.descriptor 都有[[Set]] 字段。
-
传入参数propId.name,propId.descriptor, 和 false 给内部方法[[DefineOwnProperty]]并执行.(Call the [[DefineOwnProperty]] internal method of obj with arguments propId.name, propId.descriptor, and false.)
-
返回obj对象(Return obj.)
如果以上步骤抛出一个 SyntaxError,那么实现应该把这个错误视为早期错误。
产生式 PropertyAssignment: PropertyName:AssignmentExpression 按照下面的过程执行 :
- 令 propName 为解释执行 PropertyName 的结果。
- 令 exprValue 为解释执行 AssignmentExpression 的结果。
- 令 propValue 为 GetValue(exprValue)。
- 令 desc 为属性描述对象 {[[Value]]:propValue, [[Writable]]:true, [[Enumerable]]:true, [[Configurable]]:true}。
- 返回 属性标识符 (propName, desc)。
产生式 PropertyAssignment: get PropertyName( ) {FunctionBody} 按照下面的过程执行:
- 令 propName 为解释执行 PropertyName 的结果。
- 令 closure 为根据 13.2 的定义,以空参数列表和 FunctionBody 函数体创建的一个新的函数对象。传入当前执行中的执行环境的LexicalEnvironment 作为Scope。假如PropertyAssignment 包含在严格模式代码中或者FunctionBody 是严格模式代码,传入true 为严格模式标志。
- 令 desc 为属性描述对象 {[[Get]]:closure, [[Enumerable]]:true, [[Configurable]]:true}。
- 返回 属性标识符 (propName, desc)。
产生式 PropertyAssignment: set PropertyName(PropertySetParameterList ) {FunctionBody} 按照下面的过程执行:
- 令 propName 为解释执行 PropertyName 的结果。
- 令 closure 为按照 13.2 规定,以 PropertySetParameterList 作为参数列表和FunctionBody 函数体创建的一个新的函数对象。传入当前执行中的执行环境的LexicalEnvironment 作为Scope。假如PropertyAssignment 包含在严格模式代码中或者FunctionBody 是严格模式代码,传入true 为严格模式标志。
- 令 desc 为属性描述对象 {[[Set]]:closure, [[Enumerable]]:true, [[Configurable]]:true}。
- 返回属性标识符 (propName,desc)。
假如 FunctionBody 是严格模式或者被包含在严格模式代码内,PropertyAssignment 中的PropertySetParameterList,"eval" 或者"arguments" 作为标识符将会是一个语法错误。
产生式 PropertyName: IdentifierName 按照下面的过程执行:
- 返回一个包含跟 IdentifierName 完全相同的字符序列的字符串值。
产生式 PropertyName: StringLiteral 按照下面的过程执行:
- 返回 StringLiteral 的字符串值。
产生式 PropertyName: NumericLiteral 按照下面的过程执行:
- 令 nbr 为求 NumericLiteral 值的结果。
- 返回 ToString(nbr)。
参考链接:
ECMA-262 第11章 Expression
中文翻译链接 : http://www.w3.org/html/ig/zh/wiki/ES5/%E8%A1%A8%E8%BE%BE%E5%BC%8F
网络之美:JavaScript中Get和Set访问器的实现 : http://www.cnblogs.com/lhb25/archive/2010/09/19/1830724.html