Вход

Просмотр полной версии : Зачем у NodeList и HTMLCollection свойство length enumerable?


danik.js
27.03.2013, 07:51
А также 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.documentE lement.childNodes, 'length')
alert ([descriptor.enumerable, descriptor.configurable])

var descriptor = Object.getOwnPropertyDescriptor(document.documentE lement.children, 'length')
alert ([descriptor.enumerable, descriptor.configurable])

devote
27.03.2013, 10:12
На 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, а в худшем - как разрабам на душу положит. Не принимайте близко к сердцу.)