最初に親クラスを提供します(継承されたプロパティを提供します)
function Father(name){
this.name = name;
this.sum = function(){
alert(this.name)
}
}
Father.prototype.age = 38;
1.プロトタイプチェーンの継承
function Son(){
this.name = 'perter';
}
Son.prototype = new Father();// 最重要的!
var per = new Son();
console.log(per.age); // 38;
console.log(per instanceof Father);// true
重要:新しいインスタンスのプロトタイプを親クラスのインスタンスと同じにします。
機能:
1。インスタンスの継承可能なプロパティには、インスタンスのコンストラクターのプロパティ、親クラスのコンストラクターのプロパティ、および親クラスのプロトタイプのプロパティが含まれます。(新しいインスタンスは親クラスインスタンスのプロパティを継承しません!)
欠点:
1。新しいインスタンスはパラメーターを親クラスコンストラクターに渡すことができません。
2.単一の継承。
3.すべての新しいインスタンスは、親インスタンスのプロパティを共有します。(プロトタイプのプロパティは共有されます。1つのインスタンスがプロトタイププロパティを変更すると、別のインスタンスのプロトタイププロパティも変更されます!)
2.コンストラクター継承の借用(呼び出し、継承の適用)
function Con() {
Father.call(this, 'jhon');
this.age = 12;
}
var con1 = new Con();
console.log(con1.age); // 12
console.log(con1.name); // jhon
console.log(con1 instanceof Father); //false
キーポイント:.call()と.apply()を使用して、親クラスコンストラクターをサブクラス関数に導入します(親クラス関数の自己実行(コピー)はサブクラス関数で行われます)
機能:1。親のみを継承しますクラスコンストラクタ親クラスのプロトタイプのプロパティは継承されません。
2.プロトタイプチェーン継承の欠点1、2、および3を解決します。
3.複数のコンストラクター属性を継承できます(複数呼び出し)。
4.子インスタンスでは、パラメーターを親インスタンスに渡すことができます。
短所:1は、親クラスコンストラクターのプロパティのみを継承できます。
2.コンストラクターを再利用することはできません。(使用するたびに呼び出してください)
3。新しいインスタンスごとに、肥大化した親クラスコンストラクターのコピーがあります。
callとapplyの違い:call
の2番目のパラメーターの数は固定されていません。apply
の2番目のパラメーターは配列です。この配列は引数で置き換えることができます。
3.組み合わせ継承(プロトタイプと呼び出しの組み合わせ)
function Parent(value) {
this.val = value
}
Parent.prototype.getValue = function() {
console.log(this.val)
}
function Child(value) {
Parent.call(this, value)
}
Child.prototype = new Parent()
const child = new Child(1)
child.getValue() // 1
child instanceof Parent // true