ES6 では、Function オブジェクトを含む特別なオブジェクトの拡張が可能です。これは、Function オブジェクトを継承して、関数として呼び出すことができるオブジェクトを作成できることを意味します。ただし、関数を関数として呼び出す場合とメソッドとして呼び出す場合の動作が異なるため、これらの呼び出しのロジックを実装するのは困難な場合があります。
インスタンス データにアクセスするためのクロージャの使用
この問題に対する従来のアプローチは、クロージャを使用することです。クロージャは、クロージャが作成された環境にアクセスできる関数です。これにより、関数が関数として呼び出された場合でも、関数がクラスのインスタンス データにアクセスできるようになります。
<code class="js">class Smth extends Function { constructor(x) { super(() => { return x; }); } }</code>
拡張関数の使用
別のアプローチは次のとおりです。拡張機能を使います。拡張関数は、既存のオブジェクトの動作を拡張するために使用できる関数です。この場合、拡張関数を使用して Function オブジェクトの拡張バージョンを作成すると、オブジェクトが関数として呼び出されたときにインスタンス データにアクセスできるようになります。
<code class="js">class ExtensibleFunction extends Function { constructor(f) { return Object.setPrototypeOf(f, new.target.prototype); } } class Smth extends ExtensibleFunction { constructor(x) { super(() => { return x; }); } }</code>
このアプローチはより柔軟です。 Function オブジェクトだけでなく、あらゆる関数を拡張するためにクロージャを使用できるため、クロージャを使用するよりも便利です。
これらの手法を使用すると、ES6 クラスで Function オブジェクトを拡張し、関数呼び出しのカスタム ロジックを実装することができます。 .
以上がクロージャと拡張関数を使用して ES6 クラスで関数オブジェクトを拡張するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。