Консоль Google Chrome не отображает объекты, подобные массиву, правильно, когда их индексы получают/устанавливают на основе?

Часть стандарта ECMA, я считаю, что консоли Javascript будут отображать объекты как массивы, когда объекты похожи на массивы.

Такие, как: [ "hello", "world" ] для объекта, содержащего строки, индексированные цифрой.

Массивное поведение определяется как свойство длины и метод сращивания, присутствующий на объекте, а также численные индексированные свойства.

Многие из нас, вероятно, видели это с помощью jQuery в прошлом.

Я пытаюсь воспользоваться этим поведением и считаю это желательным. Однако у меня есть дополнительное требование, чтобы мои индексы использовали геттеры/сеттеры для их установки, чтобы я мог выполнять некоторую дополнительную обработку, когда они были изменены.

Однако, когда я делаю это, вышеупомянутый массив вместо этого отображается как:

[undefined × 2]

Однако объект ведет себя иначе, как простой пример.

Смотрите этот скрипт для более лучшего объяснения: http://jsfiddle.net/5YgAv/

Итак, вы видите? Два очень похожих примера, однако наличие геттера сломало его в консоли.

Я отлаживал последний исходный код Chromium, и кажется, что Chrome нажимает на консоль сообщение, которое по существу содержит функцию getter. Однако нет способа изменить исходный код консоли, чтобы он мог вызвать функцию и получить значение. Если бы это было возможно, мы могли бы изменить инструменты разработчика, чтобы правильно обрабатывать геттеры и сеттеры.

То, что я хотел бы знать, - это то, что если кто-нибудь может понять эту интересную небольшую ошибку или как ее лучше всего исправить, прежде чем я зарегистрирую ее как ошибку с командой Chrome, которая будет забыта и похоронена в глубине Google, Я действительно очень хотел бы исправить это сам так или иначе.

Я также открываю обходное решение, которое элегантно и позволяет мне выполнять специальную обработку, когда изменяются какие-либо свойства в моем объекте, подобном массиву.

Помогите мне Оби-Стапокверпл-Кеноби, ты моя единственная надежда!

[Райана]

Ответ 1

Хотя это не отвечает на вопрос WHY, Chrome не будет выписывать ваш массив, как массив, есть способ "обмануть" Chrome в этом. К счастью для нас это очень просто.

  • Перезаписать функцию toString вашего объекта, возвращая переменную данных
  • Когда вы регистрируете свой массив, запишите его как myArray.toString();

Смотрите это jsFiddle: http://jsfiddle.net/YXwxS/

В то же время я буду продолжать изучать это, потому что это интересная проблема:)