Warning:
This wiki has been archived and is now read-only.

WebIDL/zh-hans

From HTML5 Chinese Interest Group Wiki
Jump to: navigation, search

介绍

规范符合

接口定义语言

ECMAScript 绑定

ECMAScript 环境

ECMAScript 型态对应

ECMAScript 特定延伸属性

本小节定义了数个只影响 ECMAScript 绑定的延伸属性

[ArrayClass]

[Clamp]

[Constructor]

[ImplicitThis]

[LenientThis]

[NamedConstructor]

[NoInterfaceObject]

[OverrideBuiltins]

[PutForwards]

[Replaceable]

[NamedPropertiesObject]

[TreatNonCallableAsNull]

[TreatNullAs]

[TreatUndefinedAs]

[Unforgeable]

接口

对于所有满足以下条件的接口

ECMAScript 全域对象上「必须」存在一个对应的属性。属性的名称是接口的标识符,值是一个叫做接口对象的对象。

此属性具有特性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }。下面 4.4.1 小节会介绍接口对象的特性。

除此之外,对于每一个接口上的 [NamedConstructor] 延伸属性,ECMAScript 全域对象上「必须」存在一个对应的属性。属性的名称是在 “=” 后面出现的标识符,值是一个叫做有名称的构造函数的对象,可以用来构造实现该接口的对象。此属性具有特性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }。下面 4.4.2 小节会介绍接口对象的特征。

接口对象

一个非回调接口的接口对象是一个函数对象。接口对象具有某些属性,对应于在该接口上定义的常数静态操作,各分别在下面 4.4.5 小节4.4.7 小节描述。

一个非回调接口的接口对象 “prototype” 属性的值「必须」是一个叫做接口原型对象的对象。接口原型对象具有某些属性,对应于在该接口上定义的属性操作,在下面 4.4.3 小节详述。

因为非回调接口的接口对象是一个函数对象,它会有特性为 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 的 “prototype” 属性。

回调接口的接口对象「必不可」为函数对象且「必不可」有 “prototype” 属性。一个回调接口的接口对象「必须」是 Object.prototype 对象。

接口对象的 [[Call]] 方法

有名称的构造默函数

接口原型对象

每一个非回调接口,不管有没有以 [NoInterfaceObject] 延伸属性宣告,都「必须」存在一个接口原型对象。一个接口的接口原型对象具有对应于在该接口上定义的属性操作的属性。这些属性分别在下面的 4.4.6 小节4.4.7 小节详述。

接口对象相同,接口原型对象也有对应于在该接口上定义的常数的属性,在下面的 4.4.5 小节描述。

若接口上没有指定 [NoInterfaceObject] 延伸属性,则接口原型对象也「必须」有名称为 “constructor”,特性为 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true },值为接口的接口对象,的属性。

接口 A接口原型对象的内部 [[Prototype]] 属性的值「必须」依照下面规则得出:

  1. A[NamedPropertiesObject] 延伸属性宣告,则 A 的内部 [[Prototype]] 属性的值为由下面 4.4.4 小节定义的 A名称属性对象
  2. 否则,若 A 没被宣告继承另一个接口,又若接口以 [ArrayClass] 宣告,则 A 的内部 [[Prototype]] 属性的值为 Array 原型对象[ECMA-262],15.4.4 小节),否则为 Object 原型对象[ECMA-262],15.2.4 小节)。
  3. 否则,A 的内部 [[Prototype]] 属性的值为被继承接口的接口原型对象

若系统用一个以 [NoInterfaceObject] 延伸属性定义的接口当作非补充接口,则使用者可以存取该接口的接口原型对象。举例来说,在下面 IDL 中:

[NoInterfaceObject]
interface Foo {
};

partial interface Window {
  attribute Foo foo;
};

透过接口对象存取接口原型对象是不可能的(因为 window.Foo 不存在)。然而,透过 [[Prototype]] 一个 Foo 实例会将接口原型对象曝露出来 ― Object.getPrototypeOf(window.foo)

若系统仅将接口作为补充接口使用,则因为没有对象的 [[Prototype]] 内部属性是接口原型对象,没有任何方法可以存取该接口原型对象。在这种情况下,本规范接受让这个对象不存在的优化。

接口原型对象类字符串接口标识符与字符串 “Prototype” 的串接结果。

名称属性对象

常数

每一个定义在接口 A 上的常数都「必须」在接口对象(若存在)上有一个对应的属性,并有以下特征:

  • 属性的名称是常数标识符
  • 属性的值是将常数的 IDL 值转换为 ECMAScript 值的结果。
  • 属性的特性为 { [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }。

另外,接口原型对象上「必须」存在有同样特征的属性。

属性

每一个定义在接口上的属性都「必须」有对应的属性。若属性以 [Unforgeable] 延伸属性宣告,则在每一个实现接口的对象上都存在该属性。否则,属性存在于接口的接口原型对象上。

这些属性的特征为下:

  • 属性的名称是属性标识符
  • 属性的特性为 { [[Get]]: G, [[Set]]: S, [[Enumerable]]: true, [[Configurable]]: 可调节性 },其中:
  • 属性 getter 是呼叫后会执行下述步骤,“length” 属性是 Number0Function 对象:
    1. Type(V) 不是 Object,则抛出 TypeError
    2. O 不是一个实现属性来源接口平台对象则:
      1. 若属性设有 [LenientThis] 延伸属性,则回传 undefined
      2. 否则,抛出 TypeError
    3. IDL 值为,以 O 作为对象,执行在属性的描述中的「获取」属性步骤(若属性宣告为继承其 getter,使用被继承属性的步骤)的结果。
    4. V 为将 IDL 值转换为 ECMAScript 值的结果。
    5. 回传 V
  • 若属性宣告为 readonly 且上面没有 [PutForwards][Replaceable] 延伸属性宣告,则属性 setterundefined,否则属性 setter 是呼叫后会执行下述步骤,“length” 属性是 Number1Function 对象:
    1. Type(V) 不是 Object,则抛出 TypeError
    2. O 是实现属性来源接口平台对象,设 this 合法true,否则为 false
    3. this 合法false属性不设有 [LenientThis] 延伸属性,则抛出 TypeError
    4. V 为传到 Function 的第一个参数,或是 undefined(没传参数的情形)。
    5. 若属性以 [Repaceable] 延伸属性宣告,则:
      1. P 为属性的标识符。
      2. 呼叫 O 的 [[DefineOwnProperty]],传属性名称 P、属性描述 { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } 与 false
      3. 回传 undefined
    6. this 合法false,则回传。
    7. 若属性以 [PutForwards] 延伸属性宣告,则:
      1. Q 为使用属性的标识符作为属性名呼叫 O 的 [[Get]] 方法结果。
      2. Q 不是一个对象,则抛出 TypeError
      3. A[PutForwards] 延伸属性标示的属性。
      4. 使用 A 的标识符作为属性名、V 作为属性值呼叫 Q 的 [[Put]] 方法。
      5. 回传。
    8. IDL 值为下述方法决定的 IDL 值:
      • 若属性的型态是一个列举,则:
        1. S 为呼叫 ToString(V) 的结果。
        2. S 不是列举的值,则回传 undefined
        3. IDL 值是相等于 S 的列举值。
      • 否则,属性的型态不是一个列举IDL 值是将 V 转换为 IDL 值得结果。
    9. O 作为对象、执行 IDL 值作为值,执行在属性的描述中的「设置」属性步骤。
    10. 回传 undefined

请注意设置只读属性会因进行设置的脚本使用严格模式与否而有不同的行为。在严格模式中,这种设置会导致使用者代理抛出 TypeError,在非严格模式中,使用者代理会忽略这种设置。

操作

对于每一个定义在接口上的操作标识符,除非该标识符操作的参数计数为 0 上的有效重载集合为空,「必须」在接口原型对象(若操作为一般操作)或接口对象(若操作为静态操作)上有对应的属性。

这种属性有以下的特征:

  • 属性的名称是标识符
  • 属性的特性为 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }。
  • id标识符arg0..n−1 为传给函数的参数列、l接口,属性的值是一个行为如下的 Function 对象:
    1. O 为下面步骤决定的值:
      • 若操作是静态方法,则 Onull
      • 否则,若操作的来源接口具有 [ImplicitThis] 延伸属性,且 this 值是 nullundefined,则 O 是与 Function 对象关联的 ECMAScript 全局对象。
      • 否则,若 this 值不为 null,则 Othis 值。
      • 否则,抛出 TypeError
    2. O 不为 null 且不是一个实现接口 l平台对象,则抛出 TypeError
    3. S 初始化为一般操作静态操作对应于标识符 id、接口 l 与参数计数 n有效重载集合
    4. 设 <操作, > 为以 Sarg0..n−1 呼叫重载解决算法的结果。
    5. R 为(若操作不是静态方法,在 O 上)执行在具有作为参数值的操作的描述中列出的步骤得到的结果。
    6. 回传将 R 转换op 宣告的 ECMAScript 取值型态的结果。
  • Function 对象的 “length” 属性是由下面决定的 Number
    1. S一般操作静态操作对应于标识符 id、接口 l 与参数计数 0 的有效重载集合
    2. 回传在 S 的里的函数中最大的参数列长。
字符串化子
序列化子

「实现」叙述

实现接口的平台对象

如同初始对象,每一个平台对象与一个全局环境关联。描述每一个平台对象与哪一个全局环境(或是哪一个全局对象)关联的责任在于使用 WebIDL 的规范。

一个实现一个以上接口的平台对象的主接口是平台对象实现非补充接口中最底层的子接口。平台对象的内部 [[Prototype]] 属性的值是平台对象的关联全局环境中主接口接口原型对象

实现一个以上接口的平台对象的类字符串「必须」是主接口标识符

索引属性与名称属性

平台对象与 [[GetOwnProperty]] 方法

平台对象与 [[DefineOwnProperty]] 方法

平台对象与 [[Delete]] 方法

平台对象与 [[Call]] 方法

属性列举

实现回调接口的使用者对象

异常

异常对象

抛出异常

异常处理

共通定义

扩展性

以本规范作为参考资料