2011-07-07 31 views
1

我知道Object.prototype不應該被改變,但出於好奇,在IE < 9中,所有不能繼承的對象都是Object.prototypeIE中的對象列表<9無法繼承Object.prototype

到目前爲止,以下所有內容都不能從Object.prototype繼承。

  • 警報
  • 使用document.createElement
  • 的setTimeout
  • 的setInterval
  • 使用document.createElement( 'I') - ,所有其他的DOM元素
  • 使用document.createElement( 'I')的appendChild - 包括所有DOM元素方法

我在這裏創建了一個jsbin測試。所有的瀏覽器應該獲得成功,除了IE瀏覽器。

http://jsbin.com/inuhux/7 - http://jsbin.com/inuhux/7/edit

什麼其它物體在IE < 9無法從Object.prototype繼承?

回答

1

您不應該假定主機對象從任何瀏覽器或用戶代理中的內置對象繼承任何東西。沒有說明他們必須這樣做。

W3C DOM規範都是語言中立的,它們不承擔任何特定的語言功能。當他們在DOM接口中使用術語"inherit"時,意味着「此接口具有其他接口的所有特性」,而不是必須實現任何類型的繼承。

一些瀏覽器選擇使用原型繼承來實現它們,但這不是必需的。

+0

我從來不建議IE <當對標準相比,9是錯誤的。我只是要求列出所有在IE <9中無法繼承的對象。 – William

+0

也只是我對標準的兩種意義,以及瀏覽器供應商「需要」的東西。基本上標準是重要的,但肯定不定義瀏覽器的工作方式。還有很多其他的CSS和Html「標準」已經出現一段時間了,IE 9和以後都沒有遵循。最常見的是關注事實上的標準。一個很好的例子就是IE 9像大多數其他瀏覽器一樣開始從Object.prototype繼承。它的所有關於事實上的標準......以及在IE 9中的情況絕對不是標準:D – William

+0

@ Lime-瀏覽器傾向於標準化(即使IE最終也已經與版本9並列開始,並開始支持更多W3C標準)。所以你從什麼是指定的行爲開始,然後考慮怪癖。沒有理由相信** all **瀏覽器或用戶代理供應商將使用符合ECMAScript的繼承模式創建DOM接口。我也沒有建議IE是錯誤的,只是它是一個實現的例子,它選擇不爲它的DOM API實現原型繼承。 – RobG

0

你是什麼意思alert不是從對象繼承和有沒有原型:

typeof alert; // "function" 
typeof alert.prototype; // "object" 
+0

在哪個瀏覽器中?在許多版本的IE中(upto,但可能不包括,9),'typeof alert'顯示* object *,'typeof alert.prototype'顯示* undefined *。此外,您發佈的內容並未顯示* alert *從* Object.prototype *繼承,只是它在與* typeof *運算符一起使用時返回某些值。 – RobG

+0

我在IE9中測試過,但也許你的版本不同。無論如何,原型繼承意味着'alert'具有'object.prototype',而不是'object.prototype'。換句話說,想象你的手和我的手是亞當手中的原型。現在,如果亞當藉着上帝的能力得到一雙金手,你早晨醒來時看到你的雙手是金色的,就像我的一樣。 –

+0

我不知道你的迴應是什麼意思。我說過我在談論的IE版本,IE 9不是其中之一。 OP詢問了從* Object.prototype *繼承的主機對象,換句話說,在其[[Prototype]]鏈上有* Object.prototype *的主機對象。您的帖子沒有顯示。如果'typeof'顯示* function *,它只是表示它實現了一個內部的[[Call]]屬性,它不會使它成爲* Object *的實例(ECMA-262§11.4.3)。 – RobG