2009-10-07 11 views
2

JavaScript의 Object 유형을 해당 객체의 일부인 속성 이름 (기본적으로 PHP의 array_keys() 함수가 연관 배열에 대해 수행하는 기능)을 검색하는 함수로 확장하려고 시도하고있었습니다. 변수 b가 경고했다 Javascript custom Array.prototype for-in 루프와의 간섭

Object.prototype.keys = function() { 
    var a = []; 
    for (var property in this) { 
     a.push(property); 
    } 
    return a; 
}; 

var a = {a:1,b:2,c:3,d:4}; 
alert(a.toSource()); 

var b = a.keys(); 
alert(b.toSource()); 

, 내가 대신 내가 ["a","b","c","d","keys"]을보고 있어요, ["a","b","c","d"]를 볼 것으로 예상했다.

for-in 루프에는 프로토 타입 화 된 keys() 기능이 포함되어 있습니다.

아직 프로토 타입을 만드는 동안이 동작을 피할 수 있습니까? 아니면 모두 함께 프로토 타이핑하지 않아야합니까?

답변

12

아하 내장 기능 확장의 즐거움. for..in은 반복되는 객체의 전체 프로토 타입 체인을 검사합니다.

당신이 (나는이 지금은 사실상 믿는다) 루프에 hasOwnProperty와 체크가 필요한 것 :

for (var property in this) { 
    if (this.hasOwnProperty(property)) { 
     a.push(property); 
    } 
} 

hasOwnProperty 당신은 직접 객체에 정의 된 속성을 가져올 것을 보장한다 (즉, 은 아니고의 프로토 타입 체인).

+0

건배는, 매력을했다! –

+0

정보를 얻기 위해 IE 6.0에서 버전 5.0까지 (5.5 있음)와 Safari 2.02까지는 'hasOwnProperty'가 지원되지 않습니다. 이러한 브라우저를 지원하는 데 신경 쓰지 않아도되지만 실제로는 그렇지 않다는 것을 알아야합니다. –

3

대부분의 경우 기본 Object.prototype을 확장하지 않아야합니다. 그것을 확장하면 ALL 개체가 새 속성을받습니다.

개체 속성에 대한 루핑은 매우 일반적인 작업이며, 사용자가 예기 한 것처럼 예기치 않은 동작이 발생했습니다. 항상 자신의 코드에서 hasOwnProperty 기능을 사용

나는 보지 못했다

많은 사람들이, 내가 어쩌면 프로젝트에서 작업 솔로 개발자가되고, 그 아래 "제어 환경"를 말할 것입니다, 당신은 그 문제를 관리하지만, 경우 수 상황이 더 커지고 더 많은 개발자가 참여하게되면 많은 문제가 발생할 수 있습니다.

객체에 대해 고정식 함수를 만드는 방법은 무엇입니까?

Object.keys = function(obj) { 
    var a = []; 
    for (var property in obj) { 
    if (obj.hasOwnProperty(property)) { 
     a.push(property); 
    } 
    } 
    return a; 
}; 

var a = {a:1,b:2,c:3,d:4}; 
alert(a.toSource()); 

var b = Object.keys(a); 
alert(b.toSource()); 
+0

** 참고 : **'Object.keys' 메소드는 ECMAScript 5th Edition 스펙에 도입되었으며 최근의 모든 브라우저에서이를 구현합니다. 선언하기 전에 메소드가 이미 정의되어 있는지 확인해야합니다. – CMS

0

이것은 또한 작동합니다

var items = [ 
    { 
     id: 1, name: 'Item 1' 
    }, 
    { 
     id: 2, name: 'Item 2' 
    }, 
    { 
     id: 3, name: 'Item 3' 
    } 
]; 
items.forEach(function(item, index) { 
    console.log(item); 
});