Mootools при использовании проблемы For (... in Array) - PullRequest
4 голосов
/ 12 августа 2011

Эта проблема существует уже пару лет.

Я пишу несколько плагинов для движка Forum под названием Discuz, я использую множество Mootools для своих собственных проектов. Когда я подключил Mootools к этому форуму Engine (discuz), все сошло с ума ...

После того, как я выполнил некоторую отладку в прошлом году, я обнаружил, что проблема в том, что Mootools создает множество основных элементов, в том числе Array. И, с другой стороны, этот движок форума использует цикл For (i in Array) для «массива». Что, безусловно, вызовет проблемы, потому что

for(i in [1,2,3,4,5]) console.log(i);  //0,1,2,3,4 the keys in this array 

**WITH MOOTOOLS
for(i in [1,2,3,4,5]) console.log(i);
//OUTPUT 0,1,2,3,4,$family,$constructor,pop,push,reverse,shift,sort,splice.......

В последний раз я использую парсер, чтобы изменить все для цикла (я в массиве), чтобы добавить 'if item.hasOwnProperty ()', чтобы пропустить эти прототипы Но я думаю, что это очень плохой обходной путь, потому что вы знаете, вызывают больше проблем ... новые версии, исправляют их коды ... и т. Д.

Интересно, есть ли способ обойти эту проблему? не касаясь js-кода этого движка форума, а также использовать Mootools?

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

Ответы [ 3 ]

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

Вы должны использовать hasOwnProperty(), как вы упомянули. Я не уверен, почему вы думаете, что это вызовет больше проблем, действительно с циклом for(x in y), я был бы склонен использовать hasOwnProperty() по умолчанию и опускать его только для особых случаев.

Сказав это, я бы не использовал цикл for(x in y) в массиве. Как правило, лучше использовать стандартный цикл for(i=0; i<y.length; i++), который, конечно, будет игнорировать все нечисловые свойства. (За исключением, возможно, если вы знаете, что у вас есть непоследовательные индексы массива, в этом случае for(x in y) пропустит неиспользуемые индексы, но даже в этом случае я, вероятно, все равно буду использовать стандартный for и тест для undefined в цикле.)

ОБНОВЛЕНИЕ: ОК, я понял. Ваш обходной путь для вставки hasOwnProperty() - лучшее решение, о котором я могу подумать, если вы хотите продолжать использовать MooTools. должно быть достаточно безопасным для вставки сразу после закрытия ) for: вам не нужно проверять существующие {} скобки или добавлять свои собственные.

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

Mootools расширяет Array.prototype и, возможно, даже Object.prototype, что может повлиять на циклы for .. in, которые перечисляют все свойства, даже те, которые существуют в объекте, потому что они появляются вверх в цепочке прототипов.Поэтому проверьте, является ли свойство прямым свойством объекта, прежде чем использовать его:

for(i in a)
    if (a.hasOwnProperty(i))
        console.log(i);
0 голосов
/ 12 августа 2011

Некоторые новые браузеры поддерживают способы сделать все эти дополнительные свойства (семейство, конструктор и т. Д.) Не перечисляемыми, чтобы они не появлялись в циклах for-in.

Однако, если вы хотите иметь возможность поддерживать старые браузеры, я думаю, что вам не повезло: for-in - это аппаратный синтаксис, так что вы не сможете его обезопасить.(Во всяком случае, похоже, волшебная находка-замена сработала ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...