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.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)。
注:[[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
相关文章推荐
- 解析 Java 类和对象的初始化过程(由一个单态模式引出的问题谈起)
- 基于对象的javascript
- Java基础——Static修饰符+静态相关+帮助文档制作+对象初始化_调用成员过程+单例设计
- 轻松拿下JavaScript(四)——对象字面量,this,call()和apply()方法,JS的异常处理
- 图解Java对象初始化过程以及方法调用
- JavaScript学习(四)——基于对象的JavaScript语言
- (转载)JAVA中对象创建和初始化过程
- 源码-JavaScript&jQuery交互式前端开发-第3章-函数、方法与对象-使用字面量语法创建对象
- JavaScript基础系列之三 标准对象
- 对象的初始化过程
- 对象的初始化过程
- java进行对象初始化的过程
- 面向对象,面向过程 ,以及基于对象--概念比较
- JavaScript--基于对象的脚本语言学习笔记(一)
- 基于原型的JavaScript对象和基于类的对象比较
- [171124][Web前端]标准ECMAScript5.1内置对象
- JAVA中对象创建和初始化过程
- 解析Java类和对象的初始化过程
- Java内存结构、类的初始化、及对象构造过程
- 轻松学习JavaScript十二:JavaScript基于面向对象之创建对象(一)