Я считаю, что это философское решение W3C. Дизайн W3C DOM [spec] полностью ортогонален дизайну JavaScript, поскольку DOM должен быть нейтральным к платформе и языку.
Такие решения, как « getElementsByFoo()
возвращает упорядоченный NodeList
» или « querySelectorAll()
возвращает StaticNodeList
», в значительной степени преднамеренные, поэтому реализациям не нужно беспокоиться о выравнивании структуры возвращаемых данных на основе языковых реализаций (например .map
, доступность в массивах в JavaScript и Ruby, но нет в списках в C #).
W3C стремятся к низкому уровню: они скажут, что a NodeList
должно содержать свойство readonly .length
типа unsigned long, потому что они считают, что каждая реализация может хотя бы поддерживать это , но они не будут явно говорить, что []
оператор индекса должен быть перегружен для поддержки получения позиционных элементов, потому что они не хотят заглушать какой-нибудь бедный маленький язык, который хотят реализовать, getElementsByFoo()
но не могут поддерживать перегрузку операторов. Это преобладающая философия, присутствующая в большей части спецификации.
Джон Ресиг озвучил аналогичный вариант, как и ваш, к которому он добавляет :
Мой аргумент не столько в том, что NodeIterator
он не очень похож на DOM, сколько в том
, что он не очень похож на JavaScript. Он не использует преимущества функций языка JavaScript и не использует их в меру своих возможностей ...
Я немного сочувствую. Если бы модель DOM была написана специально с учетом функций JavaScript, она была бы намного менее неудобной и более интуитивной в использовании. В то же время я понимаю дизайнерские решения W3C.