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

对象初始化V8.png(英文来源: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: { } 按照下面的过程执行 :

  1. 如同以表达式 new Object() 创建新对象并将该对象返回,其中Object 是标准的内置构造器。

产生式 s ObjectLiteral: { PropertyNameAndValueList} 以及ObjectLiteral: {PropertyNameAndValueList ,} 按照下面的过程执行 :

  1. 返回解释执行 PropertyNameAndValueList 的结果。

产生式 PropertyNameAndValueList: PropertyAssignment 按照下面的过程执行 :

  1. 令 obj 等于一个新创建的对象,就如同使用 new Object() 创建一个新对象一样,其中 Object 是一个标准的内置构造器。//并不是使用 new Object() 创建对象,而是以某种方式获得一个新对象,但返回的结果和使用 new Object() 一致.
  2. propId 为解释执行 PropertyAssignment 的结果。
  3. 以参数 propId.namepropId.descriptorfalse 调用obj[[DefineOwnProperty]] 内置方法。
  4. 返回 obj

产生式 PropertyNameAndValueList: PropertyNameAndValueList,PropertyAssignment按照下面的过程执行 :

  1. obj 为解释执行 PropertyNameAndValueList 的结果。//obj此时仍是临时对象,并未返回,所以在字面量代码的其他地方不能访问obj,this也不指向obj.
  2. propId 为解释执行 PropertyAssignment 的结果。
  3. previous 为以参数 propId.name 调用 obj[[GetOwnProperty]] 内置方法的结果。
  4. 如果 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 并且previouspropId.descriptor 都有[[Get]] 字段或者previouspropId.descriptor 都有[[Set]] 字段。
  5. 传入参数propId.name,propId.descriptor, 和 false 给内部方法[[DefineOwnProperty]]并执行.(Call the [[DefineOwnProperty]] internal method of  obj with arguments propId.name, propId.descriptor, and false.)

  6. 返回obj对象(Return obj.)

如果以上步骤抛出一个 SyntaxError,那么实现应该把这个错误视为早期错误

产生式 PropertyAssignment: PropertyName:AssignmentExpression 按照下面的过程执行 :

  1. propName 为解释执行 PropertyName 的结果。
  2. exprValue 为解释执行 AssignmentExpression 的结果。
  3. propValueGetValue(exprValue)。
  4. desc属性描述对象 {[[Value]]:propValue, [[Writable]]:true, [[Enumerable]]:true, [[Configurable]]:true}。
  5. 返回 属性标识符 (propName, desc)。

产生式 PropertyAssignment: get PropertyName( ) {FunctionBody} 按照下面的过程执行:

  1. propName 为解释执行 PropertyName 的结果。
  2. closure 为根据 13.2 的定义,以空参数列表和 FunctionBody 函数体创建的一个新的函数对象。传入当前执行中的执行环境的LexicalEnvironment 作为Scope。假如PropertyAssignment 包含在严格模式代码中或者FunctionBody严格模式代码,传入true 为严格模式标志。
  3. desc属性描述对象 {[[Get]]:closure, [[Enumerable]]:true, [[Configurable]]:true}。
  4. 返回 属性标识符 (propName, desc)。

产生式 PropertyAssignment: set PropertyName(PropertySetParameterList ) {FunctionBody} 按照下面的过程执行:

  1. propName 为解释执行 PropertyName 的结果。
  2. closure 为按照 13.2 规定,以 PropertySetParameterList 作为参数列表和FunctionBody 函数体创建的一个新的函数对象。传入当前执行中的执行环境的LexicalEnvironment 作为Scope。假如PropertyAssignment 包含在严格模式代码中或者FunctionBody严格模式代码,传入true 为严格模式标志。
  3. desc属性描述对象 {[[Set]]:closure, [[Enumerable]]:true, [[Configurable]]:true}。
  4. 返回属性标识符 (propName,desc)。

假如 FunctionBody严格模式或者被包含在严格模式代码内,PropertyAssignment 中的PropertySetParameterList"eval" 或者"arguments" 作为标识符将会是一个语法错误。

产生式 PropertyName: IdentifierName 按照下面的过程执行:

  1. 返回一个包含跟 IdentifierName 完全相同的字符序列的字符串值。

产生式 PropertyName: StringLiteral 按照下面的过程执行:

  1. 返回 StringLiteral 的字符串值。

产生式 PropertyName: NumericLiteral 按照下面的过程执行:

  1. nbr 为求 NumericLiteral 值的结果。
  2. 返回 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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值