2010-03-30 2 views
8

yuiblog의 article에서 Douglas Crockford는 for in 문이 개체의 메서드를 반복합니다. 왜 다음 코드는 [ "a", "b", "c", "d", "toString"]을 생성하지 않습니까? .toString() 및 다른 메서드 멤버가 my_obj가 아닌 경우?JavaScript는 in 루프에 대해 메소드를 반복합니까?

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

그래,'Object.prototype.toString.propertyIsEnumerable() == 당신이 링크 된 문서에서 FALSE ' – CMS

+0

를 : "A 루프에서 반복하지 않습니다에 대한 ... 내장 속성이 있습니다. String의 indexOf 메서드 나 Object의 toString 메서드와 같은 모든 내장 메서드 개체를 포함하지만 루프는 모든 기본 제공 속성을 덮어 쓰는 모든 사용자 정의 속성을 반복합니다. " 내 .toString() 예제에서 "내장 된 속성을 덮어 쓰는 것을 포함하여"를 덮어 쓰지 않는다고 말하는 이유는 무엇입니까? – hekevintran

+0

@hekevintran : 내 대답이 업데이트되었습니다. –

2

은 사용자 정의 등록 정보를 반복합니다. 당신이 당신의 코드를 변경하는 경우 : 다음

console.log(a); 

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

윌 출력 : Chetan Sastry으로

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

그것 때문에 toString 다르게 처리, 지적 뾰족한 내장, 네이티브 속성.

관련 문제