Зачем у NodeList и HTMLCollection свойство length enumerable?
А также item и namedItem. Зачем это сделано? Зачем наставили палок в колеса?
var array = [1,2,3] for (var key in array) { alert(key + ' in array'); } <body> <script> var nodeList = document.documentElement.childNodes; for (var key in nodeList ) { alert(key + ' in nodeList'); } </script> </body> <body> <script> var collection = document.documentElement.children; for (var key in collection) { alert(key + ' in collection'); } </script> </body> |
Затем, что это не Array же, и никогда им не было.
Чем конкретно вам мешает такое положение дел? |
Кажется дошло. Во всех объектах, отличных от базовых типов (Array, Function, Object, String и тд) методы в прототипе configurable.
Возникли другие вопросы: на что влияет enumerable ? На for..in влияет configurable видимо. А на что enumerable? И зачем у NodeList свойство length не enumerable ? var descriptor = Object.getOwnPropertyDescriptor([], 'length') alert ([descriptor.enumerable, descriptor.configurable]) var descriptor = Object.getOwnPropertyDescriptor(document.documentElement.childNodes, 'length') alert ([descriptor.enumerable, descriptor.configurable]) var descriptor = Object.getOwnPropertyDescriptor(document.documentElement.children, 'length') alert ([descriptor.enumerable, descriptor.configurable]) |
Цитата:
|
devote, так то да, действительно:
var object = Object.create(null, { enumerable: {enumerable:true, configurable:false}, configurable: {enumerable:false, configurable:true}, }) for (var key in object) { alert(key) } Вот только почему-то с NodeList в хроме все наоборот. В нем nodeList.length имеет enumerable:false, configurable:true. В других браузерах дескриптор = undefined. Опять магия какая-то. Как уже достала эта магия. |
Ну какбэ это же не часть языка, а часть, ткскзть, api предоставляемого браузером для работы с его внутренней кухней. Потому тут всё в лучшем случае так, как написано в стандаре w3c, а в худшем - как разрабам на душу положит. Не принимайте близко к сердцу.)
|
Часовой пояс GMT +3, время: 18:40. |