可枚举属性

  • 本文关键字:属性 枚举 javascript
  • 更新时间 :
  • 英文 :


我有一个问题。当我用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
}

最新更新