Прототип Javascript для ... в итераторах? - PullRequest
0 голосов
/ 12 августа 2011

Из-за проблемы, которую я разместил здесь Mootools при использовании проблемы For (... in Array) о некотором фреймворке javascript создаст прототип объекта Array, а некоторые другие коды (движок форума) использовали For ... в цикле для циклических массивов, когда я подключаю инфраструктуру javascript к этим существующим кодам, все пойдет не так.

//BEFORE
for(key in [1,2,3,4]) console.log(key)    //0,1,2,3 keys of the array

//After JS Framework
for(key in [1,2,3,4]) console.log(key)    //0,1,2,3,$family,$constructor,pop,push,reverse,shift,sort,splice

Учитывая, что я не могу прикоснуться к исходным кодам , содержащим эти циклы For..In Array, и я также хочу использовать инфраструктуру javascript (mootools)

Могу ли я обойти это, например, прототип javascript итератор ??

каким-то образом перегрузить цикл For ... In, чтобы сделать весь мой цикл JavaScript для For ... in, чтобы сканировать тип массива и возвращать только значение, но не функцию? Я не знаю, как это сделать, но мне интересно, можно ли это сделать?

Ответы [ 4 ]

2 голосов
/ 12 августа 2011

Оригинальный код не работает ... это действительно позор.

С помощью Mozilla JavaScript - не путайте расширения Mozilla JavaScript с ECMAScript - можно определить собственный итератор для объекта. См. Что нового в JavaScript 1.7 . Тем не менее, это, вероятно, не практично в этом сценарии.

Мои предложения таковы:

  1. Исправить код
    • Следует использовать hasOwnProperty для ключевой итерации или;
    • i < arr.length для итерации индекса массива.
  2. Не допускайте работы mootools с прототипами встроенных объектов.
    • Обратитесь к документации по mootools (я не использую mootools).
  3. Используйте каркас, который не связывается с прототипами встроенных объектов.
    • jQuery не связывается с прототипами.

Счастливого кодирования.

1 голос
/ 12 августа 2011

Сохранить массив в переменной, а затем выполнить итерацию по нему следующим образом:

var items = [1,2,3,4];

for(var i = 0; i < items.length; i++) {
    console.log(i);
}
1 голос
/ 12 августа 2011

Не использовать for (key in array) логику для массивов.Он предназначен для итерации свойств объекта, а не для итерации массивов.Как вы можете видеть, когда вы используете его в массивах, вы получаете все свойства массива, в том числе не собственные свойства / методы, которые были добавлены.

Вы должны выполнить итерацию массива с этим типом цикла for:

for (var i = 0; i < array.length; i++) {
     item = array[i];
}

Да, обидно, что мы не можем использовать более короткий синтаксис для массивов, но таков язык.

Можно попытаться обойти этоэта проблема с:

for (key in array) {
    if (array.hasOwnProperty(key)) {
        // operate on array[key] here
    }
}

Но я бы не советовал.Просто безопаснее использовать итератор, предназначенный для массивов.

0 голосов
/ 12 августа 2011

Функции прототипа можно легко удалить с помощью «delete», но фреймворки, как правило, полагаются на них, поэтому это не очень хорошая идея.

delete Array.prototype.$family;
delete Array.prototype.$constructor;
delete Array.prototype.pop;
delete Array.prototype.push;
...

Плохо то, что под рукой нет простого варианта.Вы можете либо:

  1. Создать анализатор для файлов сценариев форума и добавить проверку числового ключа внутри for, используя регулярные выражения (это очень жадно, но сработает)
  2. Создайте другой класс Array2 и замените весь фреймворк, чтобы использовать этот вместо обычных массивов (это также жадность, поскольку вам могут понадобиться другие плагины позже)
  3. Поступайте правильно и подумайте о переносе всегофорум к чему-то более гибкому
...