簡體   English   中英

可枚舉屬性 JavaScript

[英]Enumerable Properties JavaScript

我有個問題。 例如,當我在 Nodelist 上使用 for...in 循環時,我會收到可枚舉的屬性,例如條目、鍵、值。這些屬性來自 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 ,而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


旁注:該示例假設keysNodeList即時原型提供(它位於基於 Chromium 的瀏覽器上)。 這是一個更通用的版本,無論它是由直接原型提供還是由鏈上更遠的東西提供,都應該工作:

 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 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM