【问题标题】:Why HTMLDivElement.constructor.prototype == HTMLDivElement ? it should be prototype object为什么 HTMLDivElement.constructor.prototype == HTMLDivElement ?它应该是原型对象
【发布时间】:2012-04-18 12:11:02
【问题描述】:

ECMASCRIPT 将原型对象定义为构造函数的原型属性。

以下是从 ECMA-262 复制的:

4.3.4 构造函数 创建和初始化对象的函数对象 注意构造函数的“原型”属性的值是一个原型对象,用于实现继承和共享属性。

为什么 HTMLDivElement.constructor.prototype == HTMLDivElement ?

如果 a 是 HTMLDivElement 对象,Object.getPrototypeOf(a) 返回 HTMLElement,而它应该返回 constructor.prototype,即 HTMLDivElement。

这与 ECMA 标准完全矛盾。

请帮助我理解这个概念...提前非常感谢。

【问题讨论】:

  • 你问题的前提其实是不正确的:HTMLDivElement.constructor.prototype !== HTMLDivElement
  • 事实上,DOM 元素并不是真正的 JavaScript。它们是模仿 JavaScript 对象行为的宿主元素。例如,Firefox 会给出非常不同的结果。
  • 感谢 Pointy,实际上 firefox 显示了 HTMLDIVElement 和 HTMLElement 的 xpconnect。所以我无法区分 chrome 和 firefox 之间的结果。 element.__proto__.toString(); [xpconnect 包装的原生原型] element.__proto__.__proto__.toString(); [xpconnect 包装的原生原型]
  • @Praveen HTMLDivElement.constructor.prototype.constructor.prototype == HTMLDivElement.constructor.prototype 在两个浏览器中
  • 是的,这是真的,constructor.prototype.constructor.prototype 是一样的,但你如何将它与我的问题联系起来?

标签: javascript dom


【解决方案1】:

Chrome 控制台显示:

HTMLDivElement.constructor.prototype == HTMLDivElement

它在控制台中显示为HTMLDivElement 的事实并不意味着它是HTMLDivElement

还有:HTMLDivElement.constructor.prototype == HTMLElement.constructor.prototype

【讨论】:

  • a = Object.getPrototypeOf(element) HTMLDivElement, b = Object.getPrototypeOf(a) HTMLElement, a.constructor.prototype == b.constructor.prototype false
  • 也许,你正在使用一些修改元素原型的 JS 库?
  • $('#adzerk3')[0] == HTMLDivElement。这就是它们的关系
【解决方案2】:

HTMLDivElement 被 w3c 定义为接口(参见http://www.w3.org/TR/html5/the-div-element.html#htmldivelement),因此其实现取决于浏览器的供应商并有所不同。

在 Chrome 中它不是一个正确的构造函数(只是尝试执行new HTMLDivElement),在 Firefox 中它根本不是一个构造函数(它是一个对象)。

【讨论】:

  • 谢谢,我在胡思乱想为什么,似乎是一个非法的构造函数。谢谢
猜你喜欢
  • 2021-10-25
相关资源
最近更新 更多