JavaScript внутри цикла выполняет итерации по методам? - PullRequest
8 голосов
/ 30 марта 2010

В статье на yuiblog Дуглас Крокфорд говорит, что оператор for in будет повторять методы объекта. Почему следующий код не создает ["a", "b", "c", "d", "toString"]? Разве .toString () и другие методы не являются членами my_obj?

Object.prototype.toString = function(){return 'abc'}
Object.prototype.d = 4;

my_obj = {
    'a':1,
    'b':2,
    'c':3
}

a = []
for (var key in my_obj) {
    a.push(key)
}

console.log(a) // prints ["a", "b", "c", "d"]

Ответы [ 2 ]

12 голосов
/ 30 марта 2010

Все определяемые пользователем свойства являются перечисляемыми, включая свойства, унаследованные от прототипа. Встроенных нативных свойств нет. toString() является одним из них. Смотрите здесь https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/For...in

Редактировать : Моя интерпретация «Однако цикл будет перебирать все пользовательские свойства (включая любые, которые перезаписывают встроенные свойства)» * * перезаписываются прямо в объект, становятся перечисляемыми. Не перезаписывать в самом прототипе. Это значит:

var my_obj = {a: 1, b: 2, c: 3};
my_obj.toString = function() {return 'abc';};

a = []
for (var key in my_obj) {
    a.push(key)
}

console.log(a) // prints ["a", "b", "c", "toString"]
3 голосов
/ 30 марта 2010

for..in перебирает определенные пользователем свойства.Если вы измените свой код на:

Object.prototype.foo = function() { return 'abc'; };

, то

console.log(a);

выдаст:

["a", "b", "c", "foo", "d"]

Как Четан Шастри указал, указал, toString обрабатывается по-разному, поскольку это встроенное встроенное свойство.

...