Остановка перечисления в JavaScript при использовании прототипа - PullRequest
0 голосов
/ 16 января 2012

Я сейчас пытаюсь разобраться с использованием прототипа в JavaScript.

Чтобы поэкспериментировать с этим, я написал функцию, которая эффективно работает, позволяя вам помещать предложение where в массивы:

Array.prototype.where=(function(){
  var tmpArr=[],
      success;

  for (var x in this){
    var success=true;
    for (var i in arguments){
      if (this[x][arguments[i][0]]!=arguments[i][1]){
        success=false;
        break;
      }
    }

    if (success==true){
      tmpArr.push(this[x]);
    }
  }
  return tmpArr;
});

Примером использования будет:

arrayName.where([0, 'Fred'], [1, 'Bloggs']);

Ради теста это работает довольно хорошо.Единственная проблема состоит в том, что если бы вы тогда запустили

for (var x in someArrayHere){
  console.log(someArrayHere[x]);
}

Вы получите выходной массив, но с записью, представляющей функцию, которую вы прототипировали.

Насколько я могу работатьвне, это отсортировано путем установки функции как не перечисляемой, но я не могу найти никаких статей, объясняющих, как остановить это.

Как бы я поступил об этом?Или я должен был бы делать ниже каждый раз?

for (var x in someArray){
  if (typeof tSch[x]!="object"){
  }
}

Ответы [ 3 ]

2 голосов
/ 16 января 2012

Конструкция for...in перечисляет все свойства объекта (и те, которые унаследованы в цепочке прототипов).Когда вы используете его с массивом, он будет перебирать все свойства Array.prototype, а также элементы массива.

Используйте обычный цикл for, чтобы предотвратить это:

for(var x = 0; x < this.length; x++) {
    //Do stuff
}
1 голос
/ 16 января 2012

Как правило, использование цикла for ... in для итерации массива является плохой практикой.

Однако простое решение заключается в использовании Object.hasOwnProperty:

for (var x in someArray) {
  if (someArray.hasOwnProperty(x)) {
    //...
  }
}

Этоэто более надежный подход, чем ваш цикл.

0 голосов
/ 16 января 2012

В общем, вы не должны связываться с прототипами нативных Объектов.Это приводит к проблемам - особенно в сочетании с внешним кодом / библиотеками.

Вместо этого вы должны сделать его функцией, работающей с параметром массива (например, function arrayWhere(arr)).

Если выЕсли вы хотите придерживаться расширения собственных прототипов, вы должны перебирать массивы с помощью метода forEach (в новых браузерах, возможно, добавьте запасной вариант, как описано в MDN), или метод объектов hasOwnProperty, как описано в этом примере .

...