プロトタイプ継承は強力な JavaScript パラダイムです。ただし、大規模なアプリケーションの管理は困難な場合があります。多数の関数を持つカルーセル クラスを考えてみましょう:
Carousel.prototype.next = function () {...} Carousel.prototype.prev = function () {..} Carousel.prototype.bindControls = function () {..}
コードをより適切に構成するためのリファクタリングには、関数をサブオブジェクトにグループ化することが含まれる場合があります。
Carousel.prototype.controls = { next: function () { ... } , prev: function() { ... }, bindControls: function () { .. } }
ただし、この変更により問題が発生します。これらの関数内の「this」キーワードはカルーセル インスタンスを参照しなくなりました。
メンテナンス「this」コンテキストは、特にクラスが親クラスから継承するシナリオでは非常に重要です。継承されたクラスのオーバーライド関数は、適切な「this」動作を保持する必要があります。
1 つの方法は、コントロールを別のクラスとして定義し、参照を保存することです。カルーセル インスタンスへ:
var Controls = function (controllable_object) { this.ref = controllable_object; }; Controls.prototype.next = function () { this.ref.foo(); } // ..
この解決策は「この」問題に対処しますが、コントロールの実装のオーバーライドを防ぎます。
より柔軟なアプローチには依存性の注入が含まれます:
var Controls = function (controllable_object) { this.ref = controllable_object; }; Controls.prototype.next = function () { this.ref.foo(); } // .. var Carousel = function () { this.controllers = []; }; Carousel.prototype.addController = function (controller) { this.controllers.push(controller); }; // ..
このシナリオでは、カルーセル クラスは複数のコントローラーを追加して、複数の機能セットに対応し、簡単なオーバーライドを可能にします。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3