1

在 Chrome 和 Firefox 的控制台上,我可以做到

Object.getPrototypeOf(document) === HTMLDocument.prototype

并得到一个true, 意味着它documentHTMLDocument类的一个实例。但在 IE 8、9 或 10 上,我会收到HTMLDocument is undefined.

那么在 IE 8、9 和 10 上,是document哪个类的实例?

(在 IE 11 Preview 上,它可以工作......有点奇怪,IE 10 如此现代,没有HTMLDocument定义的标准)。

附注:我发现 IE 上未遵循的模式有些奇怪:

Object.getPrototypeOf(document)  // => [object DocumentPrototype] { ... }

Object.getPrototypeOf(document) === Document.prototype  // => false

Object.getPrototypeOf(document.body)  // => [object HTMLBodyElementPrototype] { ... }

Object.getPrototypeOf(document.body) === HTMLBodyElement.prototype  // => true
4

1 回答 1

0

您似乎在问一个永恒的问题,“为什么不是所有浏览器都以相同的方式实现主机对象?”。

要回答关于 的问题document,让我们看一下document.constructor

Object.getPrototypeOf(document) === document.constructor.prototype; // true

那么,document.constructorIE中有什么?

document.constructor === Document; // true in IE 10, 9
// hence
Object.getPrototypeOf(document) === Document.prototype; // true in IE 10, 9

你会注意到 IE8 不支持Object.getPrototypeOf或有Document,但它确实有HTMLDocument

进一步注意,跨所有主要浏览器(不包括 IE8)

document instanceof Document; // true

因此,您可以Document.prototype用于所有浏览器,但我不建议这样做,因为您可能会破坏其他代码/前向兼容性

Document.prototype.foo = 'bar';
document.foo; // "bar"
于 2013-08-18T14:04:35.990 回答