Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Зачем у NodeList и HTMLCollection свойство length enumerable? (https://javascript.ru/forum/misc/36777-zachem-u-nodelist-i-htmlcollection-svojjstvo-length-enumerable.html)

danik.js 27.03.2013 07:51

Зачем у 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>

Aetae 27.03.2013 08:34

Затем, что это не Array же, и никогда им не было.
Чем конкретно вам мешает такое положение дел?

danik.js 27.03.2013 09:29

Кажется дошло. Во всех объектах, отличных от базовых типов (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 27.03.2013 10:12

Цитата:

Сообщение от danik.js
На for..in влияет configurable видимо. А на что enumerable?

вообще то наоборот, enumerable что бы в (for..in попадало/не попадало), а configurable на то что бы его никто не переопределил, то есть одним словом замораживает свойство. И его уже нельзя будет переопределить/удалить/заменить и т.д.

danik.js 27.03.2013 10:45

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. Опять магия какая-то. Как уже достала эта магия.

Aetae 27.03.2013 11:02

Ну какбэ это же не часть языка, а часть, ткскзть, api предоставляемого браузером для работы с его внутренней кухней. Потому тут всё в лучшем случае так, как написано в стандаре w3c, а в худшем - как разрабам на душу положит. Не принимайте близко к сердцу.)


Часовой пояс GMT +3, время: 18:40.