ホームページ >ウェブフロントエンド >フロントエンドQ&A >JavaScriptにポリモーフィズムはありますか?
JavaScript のポリモーフィズム。ポリモーフィズムとは、同じ操作が異なるオブジェクトに適用されると、異なる解釈と実行結果を生成する可能性があることを意味します。JavaScript のポリモーフィズムはサブクラスに反映され、同じ名前で直接実装できます。関数は親をオーバーライドできます。 JavaScript のクラス関数、および親クラス関数は直接オーバーライドできます。
このチュートリアルの動作環境: Windows 10 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。
意味
同じ操作が異なるオブジェクトに作用するため、異なる解釈や異なる実行結果が生成される可能性があります
たとえば、私は猫と犬を飼っています。同じコマンド「吠える」を与えると、猫は鳴き、犬は吠えます。つまり、吠えさせることは同じです。操作と呼び出しが異なれば実行も異なります。結果。
疑似コードの実装は次のようになります:
function getVoice(animals) { if(animals instanceof Cat){ console.log('喵~'); } if(animals instanceof Dog){ console.log('汪~'); } } class Cat {} class Dog {} getVoice(new Cat()); // '喵~' getVoice(new Dog()); // '汪~'
それでは、動物を追加したい場合はどうすればよいでしょうか?もう一つ判断を加えますか?それでは、動物の鳴き声を追加するたびに、getVoice を変更する必要がありますか?ちょっと面倒じゃないですか?
したがって、この問題を解決する方法を考えなければなりません~
オブジェクトのポリモーフィズム
実際、ポリモーフィズムの最も基本的な機能は、手続き型の条件文をオブジェクトに変換することです。ポリモーフィズムにより、これらの条件分岐ステートメントが排除されます。
平たく言えば、「何をするか」と「誰がどのようにするか」を分けるということです。要約すると、「変わらないもの」と「変わるかもしれないもの」を分けることです。 」。
最初に示した例は、次のように分解して理解できます:
変わらないものは、動物が発する音です。変化する可能性のあるものは、どの動物が鳴くかです。 make what sound Sound
次に、「動物が音を立てる」というアクションをさまざまなクラスに分散し (各クラスにカプセル化して)、音を鳴らす getVoice 関数で「呼び出す」というアクションを呼び出すことができます。 。
上記の例は次のように変更できます~
function getVoice (animals) { if (animals.sound instanceof Function) { // 判断是否有animal.sound且该属性为函数 animals.sound(); } } class Cat { sound () { console.log('喵~'); } } class Dog { sound () { console.log('汪~'); } } getVoice(new Cat()); // '喵~' getVoice(new Dog()); // '汪~'
ポリモーフィズムの実用的な応用
ポリモーフィズムは、組み合わせパターン/戦略モードなどの設計パターンで広く使用されています。 。 ~~
日常の開発ではポリモーフィズムを使用しませんが、いくつかの設計パターンを組み込むと、ポリモーフィズムは依然として非常に役立ちます
JS カプセル化とポリモーフィズム
継承に加えて、カプセル化とポリモーフィズムもオブジェクト指向思考のコンポーネントです。 JS のカプセル化とポリモーフィズムも、属性「シミュレーション」の柔軟な適用によって実現されます。
カプセル化は、クラスにパブリック プロパティを設定し、サブクラスに実装することでシミュレートできます。
ポリモーフィズムの実施形態はより単純で、サブクラスに同じ名前の関数を直接実装することで、親クラスの関数をオーバーライドできます。 JS には C# のような virtualde キーワードはなく、すべての親クラス関数を直接オーバーライドできます。
例:
function calc(value1,value2){ this.data1=value1; this.data2=value2; this.GetResult; this.toString=function(){ if(this.GetResult) return this.GetResult()+""; return "0"; } } function sumCalc(value1,value2){ calc.call(this,value1,value2) this.GetResult=function(){ return this.data1+this.data2; } } function productCalc(value1,value2){ calc.call(this,value1,value2) this.GetResult=function(){ return this.data1*this.data2; } } var s=new sumCalc(2,3); alert(s.toString()); //弹框5 var p=new productCalc(2,3); alert(p.toString()); //弹框6
上記のように、sumCalc クラスと productCalc クラスはどちらも calc クラスを継承して実装し、「抽象関数」GetResult() を実装します。これが JS カプセル化の実装方法です。
さらに、JS のすべてのクラスは Object から継承し、Object には独自の toString() 関数があります。したがって、上記の calc クラスの toString() 関数は、実際には元の関数 (多態性の現れ) をカバーしています。
【関連する推奨事項: JavaScript ビデオ チュートリアル 、Web フロントエンド ]
以上がJavaScriptにポリモーフィズムはありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。