2010-03-30 4 views
8

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

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"] 

ответ

12

Все пользовательские свойства перечислены, включая свойства, унаследованные от прототипа. Встроенные собственные свойства не являются. 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"] 
+2

Yep, 'Object.prototype.toString.propertyIsEnumerable() == false' – CMS

+0

Из документа вы связаны:«А для ... в цикле не перебирать встроенные свойства Эти. включают в себя все встроенные методы объектов, такие как метод indexOf String или метод toString объекта. Однако цикл будет перебирать все пользовательские свойства (в том числе любые, которые перезаписывают встроенные свойства) ». Почему в документе говорится, что «включая любые, которые переписывают встроенные свойства», если в моем примере .toString() не перезаписано? – hekevintran

+0

@hekevintran: Обновлен мой ответ. –

2

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

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

Тогда

console.log(a); 

Выведет:

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

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