Warning:
This wiki has been archived and is now read-only.
WebIDL/zh-hans
Contents
- 1 介绍
- 2 规范符合
- 3 接口定义语言
- 4 ECMAScript 绑定
- 4.1 ECMAScript 环境
- 4.2 ECMAScript 型态对应
- 4.3 ECMAScript 特定延伸属性
- 4.3.1 [ArrayClass]
- 4.3.2 [Clamp]
- 4.3.3 [Constructor]
- 4.3.4 [ImplicitThis]
- 4.3.5 [LenientThis]
- 4.3.6 [NamedConstructor]
- 4.3.7 [NoInterfaceObject]
- 4.3.8 [OverrideBuiltins]
- 4.3.9 [PutForwards]
- 4.3.10 [Replaceable]
- 4.3.11 [NamedPropertiesObject]
- 4.3.12 [TreatNonCallableAsNull]
- 4.3.13 [TreatNullAs]
- 4.3.14 [TreatUndefinedAs]
- 4.3.15 [Unforgeable]
- 4.4 接口
- 4.5 「实现」叙述
- 4.6 实现接口的平台对象
- 4.7 实现回调接口的使用者对象
- 4.8 异常
- 4.9 异常对象
- 4.10 抛出异常
- 4.11 异常处理
- 5 共通定义
- 6 扩展性
- 7 以本规范作为参考资料
介绍
规范符合
接口定义语言
ECMAScript 绑定
ECMAScript 环境
ECMAScript 型态对应
ECMAScript 特定延伸属性
本小节定义了数个只影响 ECMAScript 绑定的延伸属性。
[ArrayClass]
[Clamp]
[Constructor]
[ImplicitThis]
[LenientThis]
[NamedConstructor]
[NoInterfaceObject]
[OverrideBuiltins]
[PutForwards]
[Replaceable]
[NamedPropertiesObject]
[TreatNonCallableAsNull]
[TreatNullAs]
[TreatUndefinedAs]
[Unforgeable]
接口
对于所有满足以下条件的接口:
- 是一个有常数宣告的回调接口,或
- 是一个没有以 [NoInterfaceObject] 延伸属性宣告的非回调接口,
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]] 属性的值「必须」依照下面规则得出:
- 若 A 以 [NamedPropertiesObject] 延伸属性宣告,则 A 的内部 [[Prototype]] 属性的值为由下面 4.4.4 小节定义的 A 的名称属性对象。
- 否则,若 A 没被宣告继承另一个接口,又若接口以 [ArrayClass] 宣告,则 A 的内部 [[Prototype]] 属性的值为 Array 原型对象([ECMA-262],15.4.4 小节),否则为 Object 原型对象([ECMA-262],15.2.4 小节)。
- 否则,A 的内部 [[Prototype]] 属性的值为被继承接口的接口原型对象。
註
若系统用一个以 [NoInterfaceObject] 延伸属性定义的接口当作非补充接口,则使用者可以存取该接口的接口原型对象。举例来说,在下面 IDL 中:
[NoInterfaceObject] interface Foo { }; partial interface Window { attribute Foo foo; };
透过接口对象存取接口原型对象是不可能的(因为 window.Foo
不存在)。然而,透过 [[Prototype]] 一个 Foo 实例会将接口原型对象曝露出来 ― Object.getPrototypeOf(window.foo)
。
接口原型对象的类字符串是接口的标识符与字符串 “Prototype” 的串接结果。
名称属性对象
常数
每一个定义在接口 A 上的常数都「必须」在接口对象(若存在)上有一个对应的属性,并有以下特征:
- 属性的名称是常数的标识符。
- 属性的值是将常数的 IDL 值转换为 ECMAScript 值的结果。
- 属性的特性为 { [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }。
另外,接口原型对象上「必须」存在有同样特征的属性。
属性
每一个定义在接口上的属性都「必须」有对应的属性。若属性以 [Unforgeable] 延伸属性宣告,则在每一个实现接口的对象上都存在该属性。否则,属性存在于接口的接口原型对象上。
这些属性的特征为下:
- 属性的名称是属性的标识符。
- 属性的特性为 { [[Get]]: G, [[Set]]: S, [[Enumerable]]: true, [[Configurable]]: 可调节性 },其中:
- 若属性以 [Unforgeable] 延伸属性宣告,则可调节性为 false,否则为 true。
- G 属性是下面定义的属性 getter。
- S 属性是属性 setter,也在下面定义。
- 属性 getter 是呼叫后会执行下述步骤,“length” 属性是 Number 值 0 的 Function 对象:
- 若 Type(V) 不是 Object,则抛出 TypeError。
- 若 O 不是一个实现属性来源接口的平台对象则:
- 若属性设有 [LenientThis] 延伸属性,则回传 undefined。
- 否则,抛出 TypeError。
- 设 IDL 值为,以 O 作为对象,执行在属性的描述中的「获取」属性步骤(若属性宣告为继承其 getter,使用被继承属性的步骤)的结果。
- 设 V 为将 IDL 值转换为 ECMAScript 值的结果。
- 回传 V。
- 若属性宣告为
readonly
且上面没有 [PutForwards] 或 [Replaceable] 延伸属性宣告,则属性 setter 为 undefined,否则属性 setter 是呼叫后会执行下述步骤,“length” 属性是 Number 值 1 的 Function 对象:- 若 Type(V) 不是 Object,则抛出 TypeError。
- 若 O 是实现属性来源接口的平台对象,设 this 合法为 true,否则为 false。
- 若 this 合法为 false 且属性不设有 [LenientThis] 延伸属性,则抛出 TypeError。
- 设 V 为传到 Function 的第一个参数,或是 undefined(没传参数的情形)。
- 若属性以 [Repaceable] 延伸属性宣告,则:
- 设 P 为属性的标识符。
- 呼叫 O 的 [[DefineOwnProperty]],传属性名称 P、属性描述 { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } 与 false。
- 回传 undefined。
- 若 this 合法为 false,则回传。
- 若属性以 [PutForwards] 延伸属性宣告,则:
- 设 Q 为使用属性的标识符作为属性名呼叫 O 的 [[Get]] 方法结果。
- 若 Q 不是一个对象,则抛出 TypeError。
- 设 A 为 [PutForwards] 延伸属性标示的属性。
- 使用 A 的标识符作为属性名、V 作为属性值呼叫 Q 的 [[Put]] 方法。
- 回传。
- 设 IDL 值为下述方法决定的 IDL 值:
- 以 O 作为对象、执行 IDL 值作为值,执行在属性的描述中的「设置」属性步骤。
- 回传 undefined。
请注意设置只读属性会因进行设置的脚本使用严格模式与否而有不同的行为。在严格模式中,这种设置会导致使用者代理抛出 TypeError,在非严格模式中,使用者代理会忽略这种设置。
操作
对于每一个定义在接口上的操作的标识符,除非该标识符在操作的参数计数为 0 上的有效重载集合为空,「必须」在接口原型对象(若操作为一般操作)或接口对象(若操作为静态操作)上有对应的属性。
这种属性有以下的特征:
- 属性的名称是标识符。
- 属性的特性为 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }。
- 设 id 为标识符、arg0..n−1 为传给函数的参数列、l 为接口,属性的值是一个行为如下的 Function 对象:
- 设 O 为下面步骤决定的值:
- 若操作是静态方法,则 O 为 null。
- 否则,若操作的来源接口具有 [ImplicitThis] 延伸属性,且 this 值是 null 或 undefined,则 O 是与 Function 对象关联的 ECMAScript 全局对象。
- 否则,若 this 值不为 null,则 O 为 this 值。
- 否则,抛出 TypeError。
- 若 O 不为 null 且不是一个实现接口 l 的平台对象,则抛出 TypeError。
- 将 S 初始化为一般操作或静态操作对应于标识符 id、接口 l 与参数计数 n 的有效重载集合。
- 设 <操作, 值> 为以 S 与 arg0..n−1 呼叫重载解决算法的结果。
- 设 R 为(若操作不是静态方法,在 O 上)执行在具有值作为参数值的操作的描述中列出的步骤得到的结果。
- 回传将 R 转换为 op 宣告的 ECMAScript 取值型态的结果。
- 设 O 为下面步骤决定的值:
- Function 对象的 “length” 属性是由下面决定的 Number:
字符串化子
序列化子
「实现」叙述
实现接口的平台对象
如同初始对象,每一个平台对象与一个全局环境关联。描述每一个平台对象与哪一个全局环境(或是哪一个全局对象)关联的责任在于使用 WebIDL 的规范。
一个实现一个以上接口的平台对象的主接口是平台对象实现非补充接口中最底层的子接口。平台对象的内部 [[Prototype]] 属性的值是平台对象的关联全局环境中主接口的接口原型对象。
实现一个以上接口的平台对象的类字符串「必须」是主接口的标识符。