먼저 예를 들어 봅시다 :
// 중독 객체 .prototypeObject.prototype.bar = 1; var foo = {moo : 2}; for (var i in foo) {console.log (i); // Bar and Moo를 인쇄합니다}우리는 여기서 두 가지 점에주의를 기울여야합니다. 하나는 for in loop이 열거 될 수 있도록 설정된 속성을 무시한다는 것입니다. 예를 들어, 배열의 길이 속성. 둘째, IN은 전체 프로토 타입 체인을 가로 지르기 때문에 프로토 타입 체인이 너무 길면 성능에 영향을 미칩니다.
열거 가능한 것은 매우 이상한 단어입니다. 실제로, 당신이 자바 스크립트로 그 그림자를 찾기가 어렵고, 실제로 루비의 저자로부터 빌려온 것입니다. 열거 가능한 것을 만들기위한 목적은 독립적으로 사용하는 것이 아니라 "혼합 된"방법을 사용하는 것입니다. 프로토 타입의 많은 방법은 열거 가능이 가능하므로 프로토 타입의 초석이라고 할 수 있습니다. 나는 여기에 자세한 소개를하지 않을 것입니다. 세부 사항을 참조하십시오 - 열거 가능한.
우리는 루프 자체의 FOR의 동작을 변경할 수 없으므로 루프에 나타나고 싶지 않은 속성을 걸러내는 다른 방법 만 가져갈 수 있습니다. "JavaScript Learning Notes Objects (III) : HasOwnProperty"를 통해 HasOwnProperty 메소드가이를 수행 할 수 있음을 알고 있습니다.
HasownProperty를 사용하는 필터
여전히 이전 예제를 사용하고 있습니다.
// 중독 객체 .PrototypeObject.prototype.bar = 1; var foo = {moo : 2}; for (foo in foo) {if (foo.hasownproperty (i)) {console.log (i); }}이것은 그것을 쓰는 유일한 올바른 방법입니다. HasownProperty 방법을 사용 했으므로 이번에는 MOO 만 출력합니다. hasownproperty 메소드가 적용되지 않으면 객체가 확장 될 때 오류가 나타납니다.
이제 많은 프레임 워크가 Object.prototype에서 메소드를 확장하기로 선택하므로 이러한 프레임 워크를 사용하면 HasownProperty로 필터링되지 않은 루프를 사용하면 문제가 발생합니다.
요약
Hasownproperty 필터링 특성의 좋은 습관을 개발하는 것이 좋습니다. 기본 프로토 타입 객체가 확장되었는지 여부에 관계없이 실행중인 환경에 대한 가정을하지 마십시오.