2015-05-12 2 views
1

Можете ли вы объяснить мне это?Расширение прототипа Javascript странное поведение

JAVASCRIPT

if (typeof Array.prototype.contains != 'function') { 
    Array.prototype.contains = function (str){ 
     return this.indexOf(str) > -1; 
    }; 
} 

var text = "Hello world"; 
var tokens = text.split(" "); 
console.log(tokens.length); 
for (var i in tokens){ 
    console.log(tokens[i]); 
} 

ВЫХОД

2 
"Hello" 
"world" 
function() 

Другими словами, "содержит" функции я добавляется в массив прототипа появляется в цикл в качестве последнего элемента (но длина массива 2). Зачем?

+0

Поскольку каждое свойство, созданное посредством присваивания, * перечислимо * и 'for/in' выполняет итерации по всем свойствам перечисления. –

ответ

3

Почему?

for-in doesn't loop through array entries Потому, что петли через перечислимых свойств объекта. Вы создали новое свойство enumerable на Array.prototype, и поэтому свойство отображается в циклах for-in на любом массиве.

Растворы:

  1. Не делай этого, а петля через массивы in any of several ways that don't have that problem или

  2. Используйте hasOwnProperty, чтобы отфильтровать наследуемые свойства (см ссылку выше для более), или

  3. Определить contains как неперечислимое имущество через Object.defineProperty или подобное (вы можете это сделать только на двигателях ES5 + его нельзя подгонять).

Смежные вопросы