ES6: クラス コンストラクター呼び出しの新しいキーワードをバイパスする
ES6 では、クラスはオブジェクトの設計図として機能するだけでなく、そのコンストラクターを具体化します。 。 constructor() 関数はクラス本体として機能し、クラスが呼び出されるときにその実行がトリガーされます。ただし、必須の new キーワードを指定せずにクラスを呼び出そうとすると、多くの場合、「クラスを関数として呼び出すことはできません」というエラー メッセージが表示されます。
コンストラクター命令の理解
クラスは本質的に new 演算子に関連付けられており、インスタンス化時にクラスの新しいインスタンスが確実に作成されます。 new なしでクラスを呼び出すと、この設計原則に反し、前述のエラーが発生します。
代替解決策
望ましい動作が new の有無にかかわらずクラスの呼び出しを許可することである場合、いくつかの代替案が存在します:
1.クラスの代わりに通常の関数を使用する
通常の関数は、新たな要件なしでクラスのような動作を模倣できます。これを使用してもインスタンスのような動作を強制できますが、クラスのカプセル化と継承の機能がありません。
<code class="js">function Foo(x) { this.x = x; this.hello = function() { return this.x; }; }</code>
2. new キーワードの強制
意図された目的が常に new を使用してクラスを呼び出すことである場合、回避策は必要ありません。推奨されるコンストラクター呼び出しパターンに従うだけです:
<code class="js">(new Foo("world")).hello(); // "hello world"</code>
3.通常の関数でクラスをラップする
このアプローチでは、クラスを使用する利点を維持しながら、新規の有無にかかわらずクラスを柔軟に呼び出すことができます。ラッピング関数は常に new.
<code class="js">class Foo { constructor(x) { this.x = x; } hello() { return `hello ${this.x}`; } } var _old = Foo; Foo = function(...args) { return new _old(...args) }; Foo("world").hello(); // "hello world" (new Foo("world")).hello(); // Also works</code>
以上が「new」キーワードを使用せずに ES6 クラスを呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。