javascript高級なプログラムの設計のいくつかの経典は受け継ぎます.
20743 ワード
記事の目次構造方法継承 プロトタイプチェーンは を継承します.グループ継続 プロトタイプは を継承します.寄生式引継ぎ 寄生結合式継承 参考:https://www.jianshu.com/p/85899e287694
構造方法引継ぎ
利点:は、親にcallを利用したパラメータリストを送ることができる .は、すべての属性がインスタンスによって共有されることを回避する .
短所:例を作成していないので、方法を作成します. は、親クラスの例示的な属性と方法だけを継承することができ、プロトタイプの属性と方法 を継承することができません.
特徴:すべてのインスタンスの共有属性と方法
融合前の2つの点は、プロトタイプ方法を共有することができ、アプリケーション属性共有の問題が存在しないため、生成された例は、サブクラスのインスタンスであり、アドバンテージ親タイプの例である.
この方式の継承は構造関数の継承方式と同じである.
この継承方法は、前の組み合わせの継承をさらに改善するための組み合わせです.欠点は、父の構造関数を2回呼び出すことです.初めてサブタイプインスタンスのプロトタイプを設定したときChild.prototype=new Part() は、サブタイプのインスタンスを作成するとき である. var child 1=new Child(‘kevin’,18);ここでnew方法を実行すると、Partent.callがPart構造関数 を呼び出します.
構造方法引継ぎ
利点:
短所:
function Parent(name){
this.name = name||'default_name';
this.getInfo =function(){
return this.name
}
}
Parent.prototype.say = function(){
console.log('hello');
}
function Child(name){
Parent.call(this,name)
}
var child1 = new Child(['a']);
console.log(child1.name);// ["a"]
// child1.say(); // ,
// child1.name.push('Bob')
console.log(child1.getInfo()); // ["a"]
var child2 = new Child();
console.log(child2.getInfo());//["default_name"]
プロトタイプチェーン引継ぎ特徴:すべてのインスタンスの共有属性と方法
function Parent(){
this.name = ['sartre']
}
Parent.prototype.getName = function(){
return this.name;
}
function Child(){
}
Child.prototype = new Parent()
var child1 = new Child();
console.log(child1.name); //["sartre"]
child1.name.push('mark')
console.log(child1.name); // ["sartre", "mark"]
var child2 = new Child();
console.log(child2.name); // ["sartre", "mark"]
グループ引継ぎ融合前の2つの点は、プロトタイプ方法を共有することができ、アプリケーション属性共有の問題が存在しないため、生成された例は、サブクラスのインスタンスであり、アドバンテージ親タイプの例である.
function Parent(name){
this.name = name;
this.hobbies = ['guitar','run','ball'];
}
Parent.prototype.getName = function(){
console.log(this.name);
}
function Child(name,age){
Parent.call(this,name);
this.age = age || 20;
}
//
Child.prototype = new Parent();
child.prototype.constructor = Child;
var child1 = new Child('sartre','20');
child1.hobbies.push('swim')
console.log(child1.name);
console.log(child1.age);
console.log(child1.hobbies);
var child2 = new Child('mark');
console.log(child1.name);
console.log(child1.age);
console.log(child1.hobbies);
プロトタイプ継承function createObj(o){
function F(){
}
F.prototype = o;
return new F();
}
// ES5 Object.create
// :
// ,
var person = {
name:'kevin',
friends:['daisy','kelly']
}
var person1 = createObj(person);
var person2 = createObj(person)
person1.name = 'person1';
console.log(person2.name); //kevin person2.name
person1.friends.push('taylor');
console.log(person2.friends); // ["daisy", "kelly", "taylor"]
寄生式引継ぎこの方式の継承は構造関数の継承方式と同じである.
function createObj(o){
var clone = Object.create(o);
clone.sayName = function(){
console.log('hi');
}
return clone;
}
寄生ユニット引き継ぎこの継承方法は、前の組み合わせの継承をさらに改善するための組み合わせです.欠点は、父の構造関数を2回呼び出すことです.
function Parent (name) {
this.name = name;
this.colors = ['red', 'blue', 'green'];
}
Parent.prototype.getName = function () {
console.log(this.name)
}
function Child (name, age) {
Parent.call(this, name);
this.age = age;
}
// Child.prototype = new Parent() ,
// Child.prototype Parent.prototype ?
var F = function(){
}
F.prototype = Parent.prototype
Child.prototype = new F();