где __proto__ добавляется в массив? - PullRequest
2 голосов
/ 29 декабря 2011

раньше можно было делать это без проблем:

for (data in dataArray) { // do some stuff };

Теперь он неожиданно перебирает этот массив __proto__, который был добавлен в мой dataArray.откуда, черт возьми, это произошло?это от использования библиотеки MooTools?это ломает все мои петли!: P теперь я должен сделать это вместо этого:

for (var i=0; i < dataArray.length; i++) { // do some stuff };

вещь, которую я НЕ понимаю, почему это работает ... неужели __proto__ фактически не считается элементом массива?если нет, то почему первая версия не работает так, как раньше, а вторая работает?

TIA для включения некоторых источников света ...

WR!

1 Ответ

3 голосов
/ 29 декабря 2011

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

Array.prototype.each = function(callback) {
    // this == the array. code here...
    return this;
};

это означает, что любой созданный массив будет поддерживать .each после: [].each(function(el) {});. и да, mootools - это сильно прототипная структура НА МОМЕНТ. все меняется с молоком mootools, которое идет AMD - следовательно, не расширяя туземцев ...

в конечном счете, однако, в javascript все наследуется от нативного Object через цепочку прототипов.

что касается Array, это не совсем правильный тип Array - в javascript он больше похож на Object с массивоподобными свойствами. что подводит меня к вопросу, почему у вас проблема:

for (var foo in obj) на самом деле является способом зацикливания Objects, а не Arrays. он работает и с массивами, потому что они как объекты, как я уже упоминал.

но это неправильно, особенно когда вы работаете с прототипом фреймворка или вы не уверены во всем коде, который вы запускаете, и как он повлиял на цепочку прототипов. если вы хотите использовать так называемый «ассоциативный массив» в других языках, просто используйте объект.

В mootools вы можете использовать Object.each(function(value, key) {}); для их итерации.

Или: в цикле проверьте, есть ли у элемента hasOwnProperty :

for (var data in dataArray) {
    if (dataArray.hasOwnProperty(data)) {
        // avoids working with prototype.
    }
} 
...