JavaScript各種継承方式(二):構造関数を借りて継承する.

2870 ワード


一原理
 
サブクラスのコンストラクタにコールを通して またはappy() の形で、親の構造関数を呼び出して継承を実現します.
 
function Fruit(name){
    this.name = name;
    this.eat = function(){
        console.log('eat');
    };
}

Fruit.prototype.desc = function(){
    console.log('desc');
};

function Mango(name,level){
    Fruit.call(this,name);
    this.level = level;
}

let mango1 = new Mango('    ',' ');
console.log(mango1);
let mango2 = new Mango('    ',' ');
console.log(mango2);

//
console.log(mango1.name == mango2.name); // false

//                
console.log(mango1.desc); // undefined

//    instanceof
console.log(mango1 instanceof Fruit); // false
console.log(mango2 instanceof Fruit); // false

//            
console.log(mango1.eat === mango2.eat); // false
 
 
二つの長所
 
1プロトタイプチェーンの継承方式では、サブクラスのオブジェクトが親構造関数のプロトタイプオブジェクトを共有する問題を解決しました.
2サブクラスのオブジェクトを作成すると、パラメータは親構造関数に伝達されます.
3マルチ継承が可能です.
 
三つの欠点
 
1作成された例は親の例ではなく、サブクラスの例にすぎない.
2原型チェーンがないので、instance ofは使えません.サブクラスの例は、親クラスの例示的な属性/方法だけが継承されているため、親クラスの構造関数のプロトタイプオブジェクトにおける属性/方法は継承されていない.
3各サブクラスの例は、親タイプの例示的な方法のコピーを持ち、メモリを浪費し、性能に影響を与え、親タイプの例示的な方法の多重化を実現できない.
   マンゴのインスタンスを作成するたびに、プライベートのeat関数を作成します.いくつかのマンゴの例があります.いくつかのeat関数を作成します.eat関数の多重化ができませんでした.
転載先:https://www.cnblogs.com/sea-breeze/p/10189126.html