> 웹 프론트엔드 > JS 튜토리얼 > 사용자 정의 배열 및 객체 프로토타입 메서드가 'for...in' 루프에 표시되는 것을 방지하는 방법은 무엇입니까?

사용자 정의 배열 및 객체 프로토타입 메서드가 'for...in' 루프에 표시되는 것을 방지하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-10 14:37:10
원래의
957명이 탐색했습니다.

How to Prevent Custom Array and Object Prototype Methods from Appearing in `for...in` Loops?

for in 루프에 표시되지 않는 Array.prototype 및 Object.prototype에 대한 메서드 정의

find()와 같은 도우미 메서드를 사용하여 배열 또는 객체 프로토타입을 확장하는 경우 또는 filter()를 사용하는 경우 이러한 메서드가 for in 루프에 나타나지 않도록 하는 것이 중요합니다. 이렇게 하면 잠재적인 문제와 호환성 문제를 방지할 수 있습니다.

문제: for in 루프에 표시되는 메서드

JavaScript에서 for in 루프는 객체의 속성을 반복합니다. Array.prototype 또는 Object.prototype에서 사용자 정의 메서드를 정의하는 경우 이러한 메서드는 for-in 루프의 속성으로 나타납니다.

Array.prototype.find = function(testFun) {
  // ...
};

const arr = [1, 2, 3];

for (let prop in arr) {
  console.log(prop); // Outputs: 1, 2, 3, find
}
로그인 후 복사

해결책 1: 배열이 있는 for-in 루프 방지

가장 간단한 해결책은 배열에 for-in 루프를 사용하지 않는 것입니다. 대신 전통적인 for 루프나 forEach()와 같은 Array.prototype 메서드를 사용하세요.

Array.prototype.find = function(testFun) {
  // ...
};

const arr = [1, 2, 3];

for (let i = 0; i < arr.length; i++) {
  // Do something with arr[i]
}
로그인 후 복사

해결책 2: 사용되지 않는 메서드 구문 확인

사용하지 않는 오래된 for-in 루프를 처리하려면 메소드 존재 여부를 확인하려면 메소드 정의에 가드 검사를 추가할 수 있습니다.

Object.prototype.hasOwnProperty = function() {
  // ...
};

Array.prototype.find = function(testFun) {
  if (this.hasOwnProperty('find')) {
    // Method already exists, do something
  } else {
    // Add the method
  }
};
로그인 후 복사

솔루션 3: Object.defineProperty 사용

ES5.1에서는 객체에 대해 열거할 수 없는 속성을 정의할 수 있는 Object.defineProperty를 도입했습니다. 이렇게 하면 for in 루프에 속성이 나타나는 것을 방지할 수 있습니다.

Object.defineProperty(Array.prototype, "find", {
  enumerable: false,
  // ...
로그인 후 복사

결론

위 기술을 사용하면 방해하지 않는 Array.prototype 및 Object.prototype에 대한 사용자 지정 메서드를 만들 수 있습니다. for-in 루프를 사용합니다. 이는 호환성을 보장하고 예상 동작에 의존하는 다른 코드에 대한 잠재적인 문제를 방지합니다.

위 내용은 사용자 정의 배열 및 객체 프로토타입 메서드가 'for...in' 루프에 표시되는 것을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿