В статье о 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"]
Все определяемые пользователем свойства перечислимы, включая свойства, унаследованные от прототипа. Встроенные собственные свойства - нет. 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"]
for..in
выполняет итерацию по определенным пользователем свойствам. Если вы измените свой код на:
Object.prototype.foo = function() { return 'abc'; };
Тогда
console.log(a);
выведет:
["a", "b", "c", "foo", "d"]
Как указал Chetan Sastry , toString
обрабатывается иначе, поскольку это встроенный , родная собственность.