- From: John Hax <johnhax@gmail.com>
- Date: Thu, 21 Jun 2012 19:53:19 +0800
- To: "Kang-Hao (Kenny) Lu" <kennyluck@w3.org>
- Cc: W3C HTML5 いゅ砍届舱 <public-html-ig-zh@w3.org>, DX Jin <dox.jin@gmail.com>, ? <niuxg0@hotmail.com>, 蕂獶祘 <csf178@gmail.com>
- Message-ID: <CAEeYXHU7NyrwFoQoA54e-uqrF83JGPwN6fS2-XWktoz0p1CMmQ@mail.gmail.com>
有这个是太好了。不过问题是DOM4里为啥只有NodeList是ArrayClass?为啥HTMLCollection就不是(大量API返回这个,比如getElementsByTagName/ClassName、Element.children等)?还有DOMStringList、DOMTokenList等等…… 2012/6/20 Kang-Hao (Kenny) Lu <kennyluck@w3.org> > winter 在 es-discuss 上討論 NodeList 沒有 forEach 的@件事[1],得到了下 > 面的答案: > > (12/06/20 0:21), Erik Arvidsson wrote: > > On Tue, Jun 19, 2012 at 6:42 AM, 程劭非 <csf178@gmail.com> 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 比較不清楚,稱@個機會我把 Web IDL > 的坑開了,順便簡介一下。 > > == 簡單介紹 == > > 首先,是 HTML 規範提到 Web IDL 的時候[2]是@樣說的: > > # 支援腳本的使用者代理必須(依照) Web IDL 規範描述的方式實作本規範裡 > # 面的各個IDL 片段。[WEBIDL] > > 也就是說,IDL 片段是描述 JS API 的一種語言,用在各個地方,包括 HTML、 > CSSOM、WebGL 等各個規範裡,而 Web IDL 是@種語言的規範。所以 "push Web > IDL to do this" @句話是有點奇怪的:描述 NodeList 實例的各種行為的規範是 > DOM4,沒辦法用現有的 Web IDL 語言描述@種情況的時候才需要改進 Web IDL 本身。 > > == [ArrayClass] == > > Web IDL 有提到 JS UA 必須實作下列物件: > * 介面原型物件(Document、Window、NodeList 等等) > * 介面原型物件(Document.prototype、Window.prototype、NodeList.prototype > 等等) > * ... > > 而 [ArrayClass] 的解釋[3]如下: > > # 介面 A 的介面原型物件的內部 [[Prototype]] 屬性的值「必須」依照下面規 > # 則得出: > # > # 1. 若 A 以 [NamedPropertiesObject] 延伸屬性宣告,則 A 的內部 > # [[Prototype]] 屬性的值為由下面 4.4.4 小節定義的 A 的名稱屬性物 > # 件。 > # 2. 否則,若 A 沒被宣告繼承另一個介面,又若介面以 [ArrayClass] 宣告, > # 則 A 的內部 [[Prototype]] 屬性的值為 Array 原型物件,否則為 > # Object 原型物件。 > # 3. 否則,A 的內部 [[Prototype]] 屬性的值為被繼承介面的介面原型物 > # 件。 > > 註一:感謝金大的 ES5 翻譯,@裡可以直接連到 ES5 對「Array 原型物件」和 > 「Object 原型物件」解釋的中文翻譯,實在相當不錯。 > 註二:@段話其實有點邏輯問題,把介面 A 和介面 A 的介面原型物件搞在一起。 > 有興趣的人可以回報一下錯誤,Web IDL heycam 基本上會把每個報錯誤的人加進 > 貢獻列表裡,所以有興趣的話可以幫忙一下。 > 註三:[ArrayClass] 的語法的翻譯就留給 winter 了。 > > 所以規範上,只要 interface NodeList 的前面有一個 > [ArrayClass],NodeList.prototype 的 [[Prototype]] 就會是 > Array.prototype,然後各個 NodeList 實例就會有 forEach 等等。 > > 目前 DOM4 已經在 interface NodeList 的前面放上 [ArrayClass] 了,偉大牛尾 > 巴的翻譯還沒有同步,歡迎有興趣的朋友幫忙一下。 > > == 屬性 == > > 每一個 interface XXX 都列一些屬性,Web IDL 對 JS 實作的要求有很多都列在 > 《屬性》[4]@個小節裡列的@個演算法。其中,基本上演算法的流程就是(以@取 > 屬性為例): > > 呼叫屬性 getter → Web IDL 屬性 getter 步驟 → 規範中的屬性「@取」步驟 > (ES5) (Web IDL) (HTML 等等) > > 其中,[4]的@個步驟等於是將 ES 的值轉換成 IDL 值,而各規範的演算法描述是 > 操作在 IDL 值上,所以*理論上*每個介面都可以用不同語言實作,當然實際上大 > 部分人都只對 JS 有興趣而已。 > > @取步驟中比較有名的就是 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 > >
Received on Thursday, 21 June 2012 11:53:50 UTC