有这个是太好了。不过问题是DOM4里为啥只有NodeList是ArrayClass?为啥HTMLCollection就不是(大量API返回这个,比如getElementsByTagName/ClassName、Element.children等)?还有DOMStringList、DOMTokenList等等……

2012/6/20 Kang-Hao (Kenny) Lu <[email protected]>

> winter 在 es-discuss 上���� NodeList �]有 forEach 的�@件事[1],得到了下
> 面的答案:
>
> (12/06/20 0:21), Erik Arvidsson wrote:
> > On Tue, Jun 19, 2012 at 6:42 AM, 程劭非 <[email protected]> wrote:
> >> I guess we can try to push Web IDL to do this.
> >
> > WebIDL provides [ArrayClass] and DOM4 make NodeLists ArrayClass. This
> > means that NodeLists have Array.prototype on its prototype chain.
>
> 好像很多人�� ES5 比�^清楚,�� Web IDL 比�^不清楚,�Q�@���C��我把 Web IDL
> 的坑�_了,��便��介一下。
>
> == ���谓榻B ==
>
> 首先,是 HTML ����提到 Web IDL 的�r候[2]是�@�诱f的:
>
>  # 支援�_本的使用者代理必��(依照) Web IDL ����描述的方式��作本�����e
>  # 面的各��IDL 片段。[WEBIDL]
>
> 也就是�f,IDL 片段是描述 JS API 的一�N�Z言,用在各��地方,包括 HTML、
> CSSOM、WebGL 等各�������e,而 Web IDL 是�@�N�Z言的����。所以 "push Web
> IDL to do this" �@句��是有�c奇怪的:描述 NodeList ��例的各�N行�榈囊���是
> DOM4,�]�k法用�F有的 Web IDL �Z言描述�@�N情�r的�r候才需要改�M Web IDL 本身。
>
> == [ArrayClass] ==
>
> Web IDL 有提到 JS UA 必����作下列物件:
> * 介面原型物件(Document、Window、NodeList 等等)
> * 介面原型物件(Document.prototype、Window.prototype、NodeList.prototype
> 等等)
> * ...
>
> 而 [ArrayClass] 的解��[3]如下:
>
>  # 介面 A 的介面原型物件的�炔� [[Prototype]] �傩缘闹怠副仨�」依照下面��
>  # �t得出:
>  #
>  # 1. 若 A 以 [NamedPropertiesObject] 延伸�傩孕�告,�t A 的�炔�
>  #    [[Prototype]] �傩缘闹��橛上旅� 4.4.4 小��定�x的 A 的名�Q�傩晕�
>  #    件。
>  # 2. 否�t,若 A �]被宣告�^承另一��介面,又若介面以 [ArrayClass] 宣告,
>  #    �t A 的�炔� [[Prototype]] �傩缘闹��� Array 原型物件,否�t��
>  #    Object 原型物件。
>  # 3. 否�t,A 的�炔� [[Prototype]] �傩缘闹��楸焕^承介面的介面原型物
>  #    件。
>
> �]一:感�x金大的 ES5 翻�g,�@�e可以直接�B到 ES5 �Α�Array 原型物件」和
> 「Object 原型物件」解��的中文翻�g,��在相��不�e。
> �]二:�@段��其��有�c�������},把介面 A 和介面 A 的介面原型物件搞在一起。
> 有�d趣的人可以回�笠幌洛e�`,Web IDL heycam 基本上��把每���箦e�`的人加�M
> ���I列表�e,所以有�d趣的��可以�兔σ幌隆�
> �]三:[ArrayClass] 的�Z法的翻�g就留�o winter 了。
>
> 所以����上,只要 interface NodeList 的前面有一��
> [ArrayClass],NodeList.prototype 的 [[Prototype]] 就��是
> Array.prototype,然後各�� NodeList ��例就��有 forEach 等等。
>
> 目前 DOM4 已��在 interface NodeList 的前面放上 [ArrayClass] 了,�ゴ笈N�
> 巴的翻�g���]有同步,�g迎有�d趣的朋友�兔σ幌隆�
>
> == �傩� ==
>
> 每一�� interface XXX 都列一些�傩裕�Web IDL �� JS ��作的要求有很多都列在
> 《�傩浴�[4]�@��小���e列的�@��演算法。其中,基本上演算法的流程就是(以�@取
> �傩��槔�):
>
> 呼叫�傩� getter → Web IDL �傩� getter 步�E → ����中的�傩浴斧@取」步�E
>     (ES5)              (Web IDL)           (HTML 等等)
>
> 其中,[4]的�@��步�E等於是�� ES 的值�D�Q成 IDL 值,而各����的演算法描述是
> 操作在 IDL 值上,所以*理��上*每��介面都可以用不同�Z言��作,��然���H上大
> 部分人都只�� JS 有�d趣而已。
>
> �@取步�E中比�^有名的就是 IDL �傩裕��热��傩苑瓷洌�5]:
>
>  # 一些IDL属性被定义用来反映特定的内容属性。这意味着,当获取该属性
>  # 时,IDL属性必须返回内容属性当前的值;当设置该属性时,IDL属性用给出的
>  # 值修改内容属性的值。
>
> [1] https://mail.mozilla.org/pipermail/es-discuss/2012-June/023581.html
> [2] http://www.w3.org/html/ig/zh/wiki/HTML5/infrastructure#interactive
> [3] http://www.w3.org/html/ig/zh/wiki/WebIDL#interface-prototype-object
> [4] http://www.w3.org/html/ig/zh/wiki/WebIDL#es-attributes
> [5] http://www.w3.org/html/ig/zh/wiki/HTML5/common-dom-interfaces#reflect
>
>
> 以上
>
> Kenny
>
>

回复