クロージャと拡張関数を使用して ES6 クラスで関数オブジェクトを拡張するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-10-21 06:10:02
オリジナル
451 人が閲覧しました

How to Extend Function Objects with ES6 Classes Using Closures and Extension Functions?

ES6 クラスによる関数の拡張

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 サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート