>  기사  >  웹 프론트엔드  >  in에 대한 Javascript의 결함 요약

in에 대한 Javascript의 결함 요약

高洛峰
高洛峰원래의
2017-02-08 17:31:531049검색

Javascript for in의 결함 요약

for in 문은 다음과 같이 객체의 속성(구성원)을 나열하는 데 사용됩니다.

var obj = { name:"jack",
   getName:function(){return this.name}
};
//输出name,getName 
for(var atr in obj) {
  alert(atr);
}

당신은 obj가 toString 및 valueOf와 같은 내장 속성(또는 내장 멤버, 숨겨진 속성 및 사전 정의된 속성)이 출력되지 않는다는 점을 확인하세요. 즉, for in은 개체의 표시된 멤버(사용자 지정 멤버)를 나열하는 데 사용됩니다.

내장 속성을 재정의하면 obj의 toString

var obj = {name:"jack",
   getName:function(){return this.name},
   toString:function(){return "I'm jack."}
}
for(var atr in obj) {
  alert(atr);
}

를 다시 작성해 보겠습니다.

1. IE6/7/8에서는 String을 다시 작성하지 않는 것과 동일하며 여전히 출력 이름인 getName

2. Opera/Safari 다음 출력 name, getName, toString

내장 프로토타입에 속성/메서드를 추가하면

Object.prototype.clone = function() {}
var obj = {
  name: 'jack',
  age: 33
}
// name, age, clone
for (var n in obj) {
  alert(n)
}

Object.prototype 메소드 복제에 추가되어 모든 브라우저에 복제가 표시됩니다.

Prototype.js가 쇠퇴하는 이유 중 하나인 내장 생성자의 프로토타입을 확장하는 것은 일반적으로 권장되지 않기 때문에 이는 큰 문제가 아닐 수도 있습니다. jQuery와 Underscore는 자체 프로토타입을 확장하지 않습니다. 전자는 jQuery 개체에 대해 소란을 피우는 반면 후자는 단순히 밑줄 아래에 모든 메서드를 중단합니다.

그러나 때때로 ES5 이후 버전과의 호환성을 위해 ES5(IE6/7/8)를 지원하지 않는 브라우저에서 내장 생성자의 프로토타입을 확장할 예정입니다. 의지가 다릅니다. 아래와 같이

if (!Function.prototype.bind) {
  Function.prototype.bind = function(scope) {
    var fn = this
    return function () {
      fn.apply(scope, arguments)
    }
  }
}
function greet(name) {
  alert(this.greet + ', ' + name)
}
for (var n in greet) {
  alert(n)
}

IE6/7/8 출력은 바인딩되지만 다른 브라우저에서는 바인딩되지 않습니다. 바인딩은 최신 브라우저에서 기본적으로 지원되고 in은 사용할 수 없기 때문에 IE6/7/8은 Function.prototype에 바인딩을 추가합니다.

요약하자면, 크로스 브라우저 디자인에서는 일반적으로 hasOwnProperty를 사용하여 객체의 멤버 이름을 얻을 수 없습니다.


읽어주셔서 감사합니다. 도움이 되기를 바랍니다. 이 사이트를 지원해 주셔서 감사합니다!

in에 대한 Javascript의 결함 요약과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.