, чтобы я мог сделать это:

Array.prototype.find = function(testFun) {
   // code to find element in array
};

Это работает нормально, но если я перебираю массив в цикле

var arr = [1, 2, 3];
var found = arr.find(function(el) { return el > 2; });

, методы появляются в виде значений: for in Это будет винт кто-нибудь еще, полагаясь на циклы

for (var prop in arr) { console.log(prop); }
// prints out:
// 1
// 2
// 3
// find

. Как я могу создать больше таких методов, которые не будут отображаться в цикле for in (Firefox действительно предоставил магиюfor in? for in Это довольно просто: не используйте циклы

for-in с массивами , чтобы сообщить им во время разработки. . Обвините всех, кто так поступил — Вот хороший фрагмент Конечно, если кто-то выполняет перечисление в универсальной функции и не знает, получает ли он массив, простой объект или объект с пользовательским прототипом, вы можете использовать

Конечно, если выполнить перечисление в обобщенной функции и не знает, получает ли он массив, простой объект или объект с пользовательским прототипом, вы можете использовать hasOwnPropertyнапример:

for (var prop in anyObj )
    if (Object.prototype.hasOwnProperty.call(anyObj, prop))
        // do something

Обратите внимание на явное использование Object.prototype для получения функции — могут быть объекты, которые ее перезаписывают (особенно в карты данных, значение может даже не быть функцией), объекты, которые не поддерживают его , или объекты, которые вообще не наследуются от Object.prototype. Смотрите также говорится, что Глядя на вывод

Тем не менее, только автор сценария, который знает о проблеме, отфильтровывает все его циклы for-in-loop — а некоторые делают это только потому, что его рекомендуют — и делает это в основном неправильно, он вместо этого следует использовать итерацию массива цикла for. Но наша проблема — это те авторы, которые об этом не знают.

Интересным, но подходящим только для Mozilla подходом было бы перезапись поведения перечислений в массивах с помощью __iterate__, как продемонстрировано здесь Продемонстрировано здесь Глядя на вывод

К счастью, EcmaScript 5.1 позволяет нам устанавливать свойства так, чтобы они были Для рисунка ниже примите ту же директиву, что и выше, с этим дополнением: . Конечно, это не поддерживается в старых браузерах, но зачем? Нам нужно использовать es5-shims даже после завершения функции add_gen, поэтому вы получите 5 при выполнении Последняя строка примера. definePropertyнапример:

Object.defineProperty(Array.prototype, "find", {
    enumerable: false,
    writable: true,
    value: function(testFun) {
        // code to find element in array
    }
});

В зависимости от ваших ограничений:

// In EcmaScript 5 specs and browsers that support it you can use the Object.defineProperty
// to make it not enumerable set the enumerable property to false
Object.defineProperty(Array.prototype, 'find', {
    enumerable: false,  // this will make it not iterable
    get: function(testFun) {
       // code to find element in array
    };
});

Подробнее о Конечно, вам лучше использовать JavaScript-фреймворк, такой как здесь https://developer.mozilla.org/en-US/docs/JavaScript/Reference/ Global_Objects / Object / defineProperty

Это потому, что нужно проверять наличие hasOwnProperty:

for (var prop in arr) { 
  if (arr.hasOwnProperty(prop)) { 
    console.log(prop) 
  }
}

Теперь эти журналы 1, 2, 3.