>웹 프론트엔드 >JS 튜토리얼 >JavaScript에서 \'new\' 키워드 없이 클래스 생성자를 호출할 수 있습니까?

JavaScript에서 \'new\' 키워드 없이 클래스 생성자를 호출할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-26 04:12:27193검색

 Can You Call a Class Constructor Without the 'new' Keyword in JavaScript?

'new' 키워드 없이 클래스 생성자 호출

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' 키워드를 사용하는 것이 필수적입니다.

'new' 키워드 생략: 솔루션 및 장단점

세 가지 기본 접근 방식이 있습니다. 이 제한을 극복하려면:

1. 일반 함수

클래스를 사용하는 대신 유사하게 동작하는 일반 함수를 정의할 수 있습니다.

<code class="javascript">function Foo(x) {
  if (!(this instanceof Foo)) return new Foo(x);
  this.x = x;
  this.hello = function() {
    return this.x;
  }
}</code>

2. 'new' 키워드 적용

클래스가 항상 '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>

3. 함수 래핑

클래스를 일반 함수 내부로 래핑하면 '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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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