JavaScript 내장 클래스/객체 확장

JS 내장 객체 또는 클래스에서 제공하는 기능을 확장하고자 할 수 있습니다. JavaScript에서 아직 지원하지 않는 배열 또는 문자열에 대한 기능이 있을 수 있지만 프로젝트에서 많이 사용합니다. 일반적으로 표준 유틸리티 기능을 만들어 이를 수행할 수 있습니다.

배열을 섞는 예를 들어 보겠습니다. 배열을 취하는 셔플 함수를 만들 수 있습니다.

function shuffle(arr) {
    for (let i = arr.length - 1; i > 0; i--) {
        const random = Math.floor(Math.random() * (i + 1));
        [arr[i], arr[random]] = [arr[random], arr[i]];
    }
    return arr;
}

const input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
console.log(shuffle(input)); // [ 7, 8, 10, 3, 2, 9, 5, 1, 4, 6 ]

참고: 어레이를 무작위로 섞기 때문에 저와 다른 콘솔 출력을 얻을 수 있습니다.

그러나 이 셔플 메소드를 Array의 프로토타입에 추가하여 내장 메소드( pop , slice , sort 로 사용할 수 있습니다.

Array.prototype.shuffle = function () {
    let arr = this;
    for (let i = arr.length - 1; i > 0; i--) {
        const random = Math.floor(Math.random() * (i + 1));
        [arr[i], arr[random]] = [arr[random], arr[i]];
    }
    return arr;
}

const input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
console.log(input.shuffle()); // [ 2, 4, 9, 8, 5, 7, 3, 10, 6, 1 ]

이제 프로토타입에서 선언했으며 input.shuffle() 형식을 사용하여 모든 배열에서 호출할 수 있습니다.

단점



많은 사람들이 내장 클래스나 객체를 확장하는 것을 권장하지 않습니다. 논란이 되는 주제입니다. 몇 가지 단점이 있습니다.
  • ECMAScript는 우리가 만든 사용자 정의 메서드 버전을 구현할 수 있습니다. 예를 들어, 다음 ES 버전이 shuffle 속성을 Arrays에 가져오면 충돌이 발생합니다.
  • 기존 방법의 기능을 덮어쓰는 것을 막을 수 있는 것은 없습니다. 예를 들어 사용자 지정 함수를 사용하여 배열에서 slice 메서드의 동작을 변경할 수 있습니다. 다른 사람들은 내장된 방법에 의존할 수 있으므로 그렇게 하는 것은 엔터프라이즈 앱의 경우 좋은 방법이 아닙니다. 나는 조직의 많은 사람들을 위해 기능을 중단할 것입니다.
  • 좋은 웹페이지 즐겨찾기