> 웹 프론트엔드 > JS 튜토리얼 > JavaScript에서 'new' 연산자를 사용하여 생성자에 인수를 동적으로 전달하려면 어떻게 해야 합니까?

JavaScript에서 'new' 연산자를 사용하여 생성자에 인수를 동적으로 전달하려면 어떻게 해야 합니까?

Mary-Kate Olsen
풀어 주다: 2024-12-04 10:58:11
원래의
1005명이 탐색했습니다.

How Can I Dynamically Pass Arguments to a Constructor Using the `new` Operator in JavaScript?

New 연산자로 Apply() 메서드의 한계 극복

JavaScript에서 apply() 메서드를 사용하면 임의 개수의 인수를 배열로 전달할 수 있습니다. 사전 정의된 기능으로 확장하여 잠재적으로 기능을 확장합니다. 그러나 객체 인스턴스화에 필수적인 new 연산자와 결합하면 이 접근 방식은 고유한 과제를 제시합니다. 생성자는 일반적으로 고정된 수의 인수를 기대합니다.

제 질문은 객체 인스턴스를 생성하려는 욕구에서 발생했습니다. 생성자에 인수를 동적으로 제공하면서 new 연산자를 사용합니다.

장애물:

처음에는 이 개념을 구현하려고 노력했습니다:

function Something(){
    // Initializations
}
function createSomething(){
    return new Something.apply(null, arguments);
}
var s = createSomething(a,b,c); //'s' is an instance of Something
로그인 후 복사

그러나 이 접근 방식은 효과적이지 않은 것으로 판명되었습니다.

문제 해결:

대응하여 수많은 솔루션이 제안되었습니다. 내 쿼리에 적용했지만 apply()와 new 연산자의 완벽한 통합을 제공하는 제품은 없었습니다. 각각 고유한 장점과 주의 사항이 있는 대체 솔루션이 제안되었습니다.

선호 솔루션:

Matthew Crumley가 제안한 저에게 가장 마음에 드는 솔루션은 영리한 방법을 사용했습니다. Function.prototype.bind 및 중간 함수를 사용하는 접근 방식:

var createSomething = (function() {
    function F(args) {
        return Something.apply(this, args);
    }
    F.prototype = Something.prototype;

    return function() {
        return new F(arguments);
    }
})();
로그인 후 복사

이 접근 방식은 명확합니다. apply()를 사용하고 의도한 기능을 구현하는 별도의 함수 F를 사용합니다.

또 다른 실행 가능한 옵션:

Simon Lyall이 제공하는 또 다른 주목할만한 솔루션은 다음을 활용합니다. Function.prototype.bind 및 eval():

function createSomething(){
  var args = [].slice.call(arguments),
      constr = eval("new ("+Something.name+"(" + args+ "))");
  return constr;
}
로그인 후 복사

우아하고 간결하면서도 이 접근 방식은 eval()에 의존하므로 다양한 환경에서 보안 및 호환성에 대한 우려가 발생할 수 있습니다.

결론:

apply() 메서드는 이를 처리하는 강력한 방법을 제공하지만 동적 인수 수로 인해 new 연산자와의 직접 통합은 JavaScript에서 지원되지 않습니다. 대신, 유사한 기능을 달성하기 위해 대체 솔루션을 사용할 수 있으므로 다양한 인수를 사용하여 객체 인스턴스를 유연하게 생성할 수 있습니다.

위 내용은 JavaScript에서 'new' 연산자를 사용하여 생성자에 인수를 동적으로 전달하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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