ホームページ >ウェブフロントエンド >フロントエンドQ&A >JavaScriptにポリモーフィズムはありますか?

JavaScriptにポリモーフィズムはありますか?

WBOY
WBOYオリジナル
2022-07-01 16:06:271930ブラウズ

JavaScript のポリモーフィズム。ポリモーフィズムとは、同じ操作が異なるオブジェクトに適用されると、異なる解釈と実行結果を生成する可能性があることを意味します。JavaScript のポリモーフィズムはサブクラスに反映され、同じ名前で直接実装できます。関数は親をオーバーライドできます。 JavaScript のクラス関数、および親クラス関数は直接オーバーライドできます。

JavaScriptにポリモーフィズムはありますか?

このチュートリアルの動作環境: Windows 10 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。

JavaScript におけるポリモーフィズム

意味

同じ操作が異なるオブジェクトに作用するため、異なる解釈や異なる実行結果が生成される可能性があります

たとえば、私は猫と犬を飼っています。同じコマンド「吠える」を与えると、猫は鳴き、犬は吠えます。つまり、吠えさせることは同じです。操作と呼び出しが異なれば実行も異なります。結果。

疑似コードの実装は次のようになります:

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。