ES6에서 클래스는 캡슐화 및 상속을 위한 간결한 구문을 제공합니다. 그러나 'new' 키워드 없이 클래스 생성자를 호출하는 것은 걸림돌이 될 수 있습니다.
다음 클래스를 고려해보세요.
<code class="javascript">class Foo { constructor(x) { if (!(this instanceof Foo)) return new Foo(x); this.x = x; } hello() { return `hello ${this.x}`; } }</code>
직관적으로 다음 코드가 작동할 것으로 예상할 수 있습니다.
<code class="javascript">Foo("world").hello(); // "hello world"</code>
그러나 이 시도는 "클래스를 함수로 호출할 수 없습니다."라는 오류와 함께 실패합니다.
JavaScript에서 클래스는 " 클래스 바디'는 생성자 역할을 합니다. 이 생성자는 클래스가 호출될 때 호출되어 클래스의 인스턴스를 만듭니다. 따라서 생성자를 시작하고 새 객체를 생성하려면 'new' 키워드를 사용하는 것이 필수적입니다.
세 가지 기본 접근 방식이 있습니다. 이 제한을 극복하려면:
클래스를 사용하는 대신 유사하게 동작하는 일반 함수를 정의할 수 있습니다.
<code class="javascript">function Foo(x) { if (!(this instanceof Foo)) return new Foo(x); this.x = x; this.hello = function() { return this.x; } }</code>
클래스가 항상 'new' 키워드로 호출되도록 하려면 생성자 내에서 검사를 구현할 수 있습니다.
<code class="javascript">class Foo { constructor(x) { if (!(this instanceof Foo)) throw new Error("Class must be invoked with 'new'"); this.x = x; } hello() { return `hello ${this.x}`; } }</code>
클래스를 일반 함수 내부로 래핑하면 'new' 키워드를 사용하거나 사용하지 않고 클래스를 호출하는 것이 가능해집니다.
<code class="javascript">class Foo { constructor(x) { this.x = x; } hello() { return `hello ${this.x}`; } } var _old = Foo; Foo = function(...args) { return new _old(...args) };</code>
각 솔루션에는 고유한 장단점이 있습니다. . 일반 함수에는 클래스의 캡슐화 및 상속 이점이 부족한 반면, 강제된 'new' 키워드는 특정 시나리오에서 유연성을 제한할 수 있습니다. 래핑 기능 접근 방식은 두 옵션 사이의 균형을 유지합니다.
위 내용은 JavaScript에서 \'new\' 키워드 없이 클래스 생성자를 호출할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!