无法列出window.document属性-为什么?

时间:2018-06-20 11:47:21

标签: javascript object-properties

运行此JavaScript在Firefox 60.2中仅列出一个属性(“位置”),但还有许多其他属性,例如“ document.title”等。

window.console.log("List props: " + Object.keys(window.document).sort().join(' / '));

为什么这样?安全?从技术上讲这是怎么做的? 如何列出所有属性?

3 个答案:

答案 0 :(得分:2)

Object.keys(o)返回o自己的,可枚举的属性。

  • 拥有:直接在o而不是在其prototype chain上定义的属性:
  • Enumerable :一个标志,用于控制列出对象的属性时是否包括给定的属性。

在这种情况下,您期望的大多数键是在document的{​​{3}}中的另一个对象上定义的:

document.hasOwnProperty("title"); // false
document.__proto__.__proto__.hasOwnProperty("title"); // true
document.__proto__.__proto__.propertyIsEnumerable("title"); // true

您可以使用for... in循环来查找在对象或其原型链上定义的可枚举属性:

for (let key in window.document) {
  console.log(key);
}

答案 1 :(得分:0)

我找不到它不能与window.document一起使用的正式原因,但是看来您也可以使用其他变量来重现此行为。 问题似乎是 Object.keys()并没有从这些变量中返回所有内容。

如果您仍在尝试获取文档的所有属性,则仍然可以使用

var props = [];
for(var prop in window.document) {
    props.push(prop);
}
console.log("List props: " + props.sort().join('/'));

与您的方法完全相同的事情。

答案 2 :(得分:0)

原因是 @IBAction func takeScreenShotTapped(_ sender: Any) { let screenShot = snapshot(of: CGRect(x: 80, y: 80, width: 100, height: 100)) } 返回返回的字符串数组代表了给定对象的所有可枚举属性。 尝试此操作以查看文档的哪些属性可枚举

snapshot()

但是,如前一个答案所述,您可以使用for-in循环将数组中的所有属性排序并加入它们