for in 문은 다음과 같이 객체의 속성(구성원)을 나열하는 데 사용됩니다.
다음과 같이 코드 코드를 복사합니다.
var obj = { 이름:"잭",
getName:function(){return this.name}
};
//출력 이름, getName
for(obj의 var atr) {
경고(atr);
}
obj의 toString 및 valueOf와 같은 기본 제공 속성(또는 기본 제공 멤버, 숨겨진 속성 및 미리 정의된 속성)이 없다는 것을 알고 계셨습니까? 즉, for in은 개체의 표시된 멤버(사용자 지정 멤버)를 열거하는 데 사용됩니다.
내장 속성을 재정의하는 경우 아래 obj의 toString을 다시 작성하세요.
다음과 같이 코드 코드를 복사합니다.
var obj = {이름:"잭",
getName:function(){return this.name},
toString:function(){return "나는 잭입니다."}
}
for(obj의 var atr) {
경고(atr);
}
무엇이 출력될까요?
1. IE6/7/8에서는 toString을 다시 쓰지 않은 것과 동일하며 여전히 name과 getName만 출력합니다.
2. IE9/Firefox/Chrome/Opera/Safari에서는 name, getName, toString이 출력됩니다.
내장된 프로토타입에 속성/메서드를 추가하면 for in 동안에도 탐색이 가능합니다.
다음과 같이 코드 코드를 복사합니다.
Object.prototype.clone = 함수() {}
var 객체 = {
이름: '잭',
나이: 33
}
// 이름, 나이, 클론
for (obj의 var n) {
경고(n)
}
clone 메소드가 Object.prototype에 추가되고 모든 브라우저는 in에 대한 복제를 표시합니다.
Prototype.js가 쇠퇴하는 이유 중 하나인 내장 생성자의 프로토타입을 확장하는 것은 일반적으로 권장되지 않기 때문에 이는 중요하지 않을 수 있습니다. jQuery와 Underscore는 자체 프로토타입을 확장하지 않습니다. 전자는 jQuery 개체에 대해 소란을 피우는 반면 후자는 단순히 밑줄 아래에 모든 메서드를 중단합니다.
그러나 때로는 ES5 이후 버전과의 호환성을 위해 ES5(IE6/7/8)를 지원하지 않는 브라우저에서 내장 생성자의 프로토타입을 확장할 수도 있습니다. 각 브라우저. 다음과 같이
다음과 같이 코드 코드를 복사합니다.
if (!Function.prototype.bind) {
Function.prototype.bind = 함수(범위) {
var fn = 이것
반환 함수 () {
fn.apply(범위, 인수)
}
}
}
함수 Greeting(이름) {
경고(this.greet + ', ' + 이름)
}
for (var n in Greeting) {
경고(n)
}
IE6/7/8 출력은 바인딩되지만 다른 브라우저는 그렇지 않습니다. 바인딩은 최신 브라우저에서 기본적으로 지원되고 in은 사용할 수 없기 때문에 IE6/7/8은 Function.prototype에 바인딩을 추가합니다.
요약하자면, 크로스 브라우저 디자인에서는 객체의 멤버 이름을 얻기 위해 for in에 의존할 수 없습니다. 일반적으로 hasOwnProperty를 사용하여 판단합니다.