【问题标题】:Are results of hasOwnProperty() tests for DOM elements standarized?DOM 元素的 hasOwnProperty() 测试结果是否标准化?
【发布时间】:2014-03-24 05:18:45
【问题描述】:

我惊讶地发现在 Firefox 控制台中:

> document.mozPointerLockElement
> null
> 'mozPointerLockElement' in document
> true
> document.hasOwnProperty('mozPointerLockElement')
> false

而在 Chrome 控制台等效 hasOwnProperty() 测试返回 true:

> document.webkitPointerLockElement
> null
> 'webkitPointerLockElement' in document
> true
> document.hasOwnProperty('webkitPointerLockElement')
> true

HTML 标准是否指定文档的哪些属性应该是直接的并且可以使用hasOwnProperty() 进行可靠测试,还是所有这些测试都依赖于实现而不是可移植的?

【问题讨论】:

  • 很难确定某些东西不存在,但如果标准涵盖了这种行为,我会感到非常惊讶。 .hasOwnProperty() 函数是 JavaScript 的东西,DOM 真的与 JavaScript 无关。他们甚至不使用 JavaScript 语法来描述 API。
  • FireFox 中它位于 proto(proto(document)); // DocumentPrototype,我相信很少有规范说明 Host Objectswindow 和 @ 987654329@其实是要实现的,就是他们应该实现的。
  • 作为一般的经验法则,我只想说对于 host Objects,使用 in 检查 native objects(尤其是 @ 987654331@s),使用hasOwnProperty检查。如果你想知道区别; stackoverflow.com/a/7614380/1615483

标签: javascript html dom


【解决方案1】:

HTML 标准是否指定文档的哪些属性应该是直接的并且可以使用 hasOwnProperty() 进行可靠测试

是的,WebIDL 确实指定了这一点。在您的情况下,document.prototype 上应该有一个 getter 属性(如pointerLockElement is a readonly attribute)(因为它没有被声明为[Unforgeable])。

或者所有这些测试都依赖于实现而不是可移植的?

但是,我不知道是否所有浏览器都遵守该规范——当然也有一些不遵守。此外,您正在测试示例中的供应商扩展(以mozwebkit 为前缀),我不知道是否完全指定了它们的行为。如果您想针对原型进行测试,请注意there are implementation differences

因此,您最好的选择是in 运算符,它检测所有属性,无论它们是在对象本身还是在其原型之一上定义的。您也可以尝试!== undefined,因为可空属性将返回null 而不是undefined

【讨论】:

    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2020-09-28
    • 2022-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多