您的位置:首页 > Web前端 > JavaScript

JavaScript对象初始化的标准过程(对象字面量) - 基于ECMAScript-262 V5.1

2014-02-01 21:46 525 查看

对象初始化

(英文来源:ECMAScript-262 第五版)

(黄底为评注或补缺)

English
对象初始化是一个以直接量的方式描述对象的初始化过程的表达式。它是用花括号括起来的由零或者多对属性名 / 关联值组成的列表,值不需要是直接量,每次对象初始化被执行到时他们会执行一次。

语法:

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.descriptorfalse 调用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)。

注:[[DefineOwnProperty]] 用于确保即使在内置的 Array.prototype 被修改的情况下数组的自身属性也会被定义,这可以避免用[[Put]] 来创建新的自身属性。
参考链接:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: