2013-06-05 29 views
2

最近關於擴展宿主對象及其原型的標準是什麼?例如。用方法_forEachDocument延伸NodeList,方法_my_query正確定義?標準(HTML5和EcmaScript 5.1)在瀏覽器中如何擴展主機對象?

我會看到任何東西我添加到主機對象Object.prototype由標準?

實際實現如何遵守相關標準?

注意:我不是問擴展主機對象或其原​​型是否是個好主意(儘管Object.defineProperty在枚舉問題上讓事情變得更簡單)。

+1

應該在IE9 +中工作。 MODS的Object.prototype應該出現在主機的對象,但它會更好地使用Node.prototype或Element.prototype或HTMLCollection.prototype等.... – dandavis

回答

0

的DOM/html元素有一個原型鏈如下: HTMLElement > Element > Node > Object
鉤在在它使塞內斯鏈的任何位置是probly最好的選擇。

+0

這並沒有解決什麼樣的規範實際上說的OP問題。 – HBP

1

的ECMASCRIPT5規範規定:

Web服務器的服務器端 計算,包括代表的請求,客戶端和 文件中的對象提供不同的主機環境;以及鎖定和共享數據的機制。通過將瀏覽器端 和服務器端腳本一起使用,可以在客戶端和服務器之間分配計算結果,同時爲基於Web的應用程序提供定製的 用戶界面。

每個支持ECMAScript的Web瀏覽器和服務器都提供它自己的主機環境, 完成ECMAScript執行環境。

我不認爲它說了別的。這可以理解爲一個實現可以符合規範並實現瀏覽器對象。過去一直如此。儘管將語言的力量應用於外部環境似乎是合乎邏輯的,我相信所有「現代」瀏覽器現在都可以這樣做。

+0

無論HTML5或DOM規範是如何定義主機環境的行爲方式,特別是哪些主機對象和原型在那裏。至少,你的報價打開了所有的可能性。 – Marc

2

ECMAScript 5沒有提及任何關於主機對象的原型鏈。

這在WebIDL中定義。

具體而言,看看ECMAScript bindings部,它說:

除非另有說明,所述的[[Prototype]]內部在本節中定義 對象的屬性是對象原型對象。

和此,從the following section

每個ECMAScript的全球環境([ECMA-262],第10.2節。3)必須 擁有自己獨特的每個初始對象集合,這些對象在 控件進入與 環境相關聯的任何ECMAScript執行上下文之前創建,但在創建該環境的全局對象之後創建。給定全局環境中所有初始對象的[[Prototype]]必須來自同一個全局環境。

甚至還有an example

iframe.appendChild instanceof Function; // Evaluates to true 

最後,Interface Prototype Object節說(重點煤礦):

命名屬性給定接口對象必須有一個 內部的[[Prototype ]]屬性,其值如下:

如果A沒有聲明繼承如果接口聲明爲 [ArrayClass],或者另一個接口,則A的內部[[Prototype]]屬性的值 是Array原型 對象([ECMA-262],第15.4.4節)對象原型對象,否則 ([ECMA-262],第15.2.4節)。

否則,它從另一個接口繼承。所述 內部[[原型]] A的屬性的值是用於繼承的接口的接口原型對象 。

因此,如果我們看一下DOM 3級,並Document interface我們可以看到,它從Node接口繼承。節點接口沒有明確地繼承其他任何東西,這意味着它繼承了Object.prototype

這是理論:)

在實踐中,並非所有瀏覽器都具有這樣的行爲,雖然大部分近期的肯定做。

+0

感謝您再次指出原型對於不同ECMAScript執行上下文不同的事實。 不WebIDL意味着瀏覽器腳本環境有暴露'NodeList'或'HTMLElement'或者說,它只能保證自己是通過'Object.getPrototypeOf(使用document.createElement(「DIV」))'等訪問? – Marc

+0

從我可以告訴,是的。在[4.4](http://www.w3.org/TR/2012/CR-WebIDL-20120419/#es-interfaces)中,它表示:「對於每個接口:... ECMAScript上必須存在__corresponding屬性全局對象___,屬性的名稱是接口的標識符,其值是一個稱爲接口對象的對象。「 – kangax

+0

順便說一句,你也可以在同一部分看到NamedConstructors的提及。和具有不同的構造的名稱(即NamedConstructor)接口的一個例子 - '[NamedConstructor =音頻,NamedConstructor =音頻(DOMString SRC)] 接口HTMLAudioElement' – kangax

相關問題