JavaScript для в цикле выполняют итерации по методам?

В статье о yuiblog Douglas Crockford говорит что 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"]

8
задан hekevintran 30 March 2010 в 01:40
поделиться

2 ответа

Все определяемые пользователем свойства перечислимы, включая свойства, унаследованные от прототипа. Встроенные собственные свойства - нет. 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"]
12
ответ дан 5 December 2019 в 11:23
поделиться

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

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

Тогда

console.log(a);

выведет:

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

Как указал Chetan Sastry , toString обрабатывается иначе, поскольку это встроенный , родная собственность.

3
ответ дан 5 December 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: