我有一个问题。当我用for…例如,在Nodelist上的循环中,我接收可枚举的属性,如条目、键、值…这些属性来自NodeList对象,这意味着我可以用NodeList.propertyIsEnumerable("keys");
测试枚举性为什么我得到一个假的回报?谢谢你的帮助。问候
这意味着我可以用
NodeList.propertyIsEnumerable("keys");
测试可枚举性
不,NodeList
是一个函数,它不具有keys
的性质。如果你想知道属性是否是NodeList
实例原型上的可枚举属性,你应该使用NodeList.prototype
,而不是NodeList
:
console.log(NodeList.prototype.propertyIsEnumerable("keys"));
// true (at least on Chromium-based browsers)
最初我认为你问题的NodeList
部分是概念性的,是特定的替代。节点列表(而不是NodeList
函数)。但是someNodeList.propertyIsEnumerabe("keys")
也会返回false
,因为propertyIsEnumerable
只返回true
对于own可枚举属性,并且keys
是继承属性:
const list = document.querySelectorAll("*");
console.log(`list.propertyIsEnumerable("keys")? ${list.propertyIsEnumerable("keys")}`);
// => list.propertyIsEnumerable("keys")? false
console.log(`Object.hasOwn(list, "keys")? ${Object.hasOwn(list, "keys")}`);
// => Object.hasOwn(list, "keys")? false
const listProto = Object.getPrototypeOf(list);
console.log(`listProto.propertyIsEnumerable("keys")? ${listProto.propertyIsEnumerable("keys")}`);
// => listProto.propertyIsEnumerable("keys")? true
console.log(`Object.hasOwn(listProto, "keys")? ${Object.hasOwn(listProto, "keys")}`);
// => Object.hasOwn(listProto, "keys")? true
旁注:这个例子假设keys
是由直接提供的。NodeList
的原型(它是基于chrome浏览器)。这里有一个更通用的版本,无论它是由直接原型提供的还是由链上的其他东西提供的,都应该可以工作:
const list = document.querySelectorAll("*");
console.log(`list.propertyIsEnumerable("keys")? ${list.propertyIsEnumerable("keys")}`);
// => list.propertyIsEnumerable("keys")? false
console.log(`Object.hasOwn(list, "keys")? ${Object.hasOwn(list, "keys")}`);
// => Object.hasOwn(list, "keys")? false
let someProto = Object.getPrototypeOf(list);
while (someProto && !Object.hasOwn(someProto, "keys")) {
someProto = Object.getPrototypeOf(someProto);
}
if (!someProto) {
console.log("Huh?! Didn't find any object with `keys`");
} else {
console.log(`someProto.propertyIsEnumerable("keys")? ${someProto.propertyIsEnumerable("keys")}`);
// => someProto.propertyIsEnumerable("keys")? true
console.log(`Object.hasOwn(someProto, "keys")? ${Object.hasOwn(someProto, "keys")}`);
// => Object.hasOwn(someProto, "keys")? true
}