JavaScript継承方式:プロトタイプチェーン、組合せ、寄生組み合わせ
6131 ワード
プロトタイプチェーン引継ぎしたがって、実例は参照タイプの属性を共有し、変更は全部変更する. 、かつ、childインスタンスを作成すると、Partentに を転送できない.
コンビネーション継承
これはJavaScriptで最もよく使われている継承モードです.
寄生グループ引き継ぎ
キー:
第1回の呼び出しに対しては、
方法:空の関数を作成して中継します. は、 は、空関数のプロトタイプ コードの説明
実は、上記の考えは
コードで説明:
「JavaScript高級プログラム設計」表示:
このような方式の高効率化は、一度だけPartent構造関数を呼び出し、従ってPartent.prototype上に不必要な、余分な属性を作成することを回避する.それと同時に、プロトタイプチェーンはまだ変わらないです.そのため、instance ofとisProttypeOfを正常に使うことができます.開発者は寄生結合式継承が引用型の最も理想的な継承モデルと考えられている.
参考:https://github.com/mqyqingfeng/Blog/issues/16
let Parent = function() {
this.name = [‘parent']
}
Parent.prototype.sayName = function() {
console.log(this.name)
}
let Child = function(){}
Child.prototype = new Parent() //
let child1 = new Child()
child1.sayName() //[‘parent’]
child1.name.push(‘child’)
let child2 = new Child()
child2.sayName() //[‘parent’, ‘child']
問題:コンビネーション継承
これはJavaScriptで最もよく使われている継承モードです.
let Parent = function(name){
this.name = name
this.staff = [‘a']
}
Parent.prototype.sayName = function(){
console.log(this.name)
}
Parent.prototype.showStaff = function(){
console.log(this.staff)
}
let Child = function(name){
Parent.call(this, name) // Parent , ( )
}
Child.prototype = new Parent() // Parent ( )
let child1 = new Child(‘child1’)
let child2 = new Child(‘child2’)
child1.sayName() //child1
child2.sayName() //child2
child1.staff.push(‘child1’)
child1.showStaff() //[‘a’, ‘child1’]
child2.showStaff() //[‘a’]
問題:Parent
アーキテクチャー関数を2回呼び出して、それぞれChild.prototype
、child
の例の2つのオブジェクトにParent
、name
の属性があるようにします.寄生グループ引き継ぎ
キー:
第1回の呼び出しに対しては、
staff
にChild.prototype
の属性があるようにすることが避けられます.方法:
Parent
のプロトタイプChild
=空関数の例を譲る.Child.prototype
を譲る.let F = function() {};
F.prototype = Parent.prototype;
Child.prototype = new F();
これにより、F.prototype = Parent.prototype
はchild
を介して__proto__
、すなわちChild.prototype
を指し、f
を介して__proto__
、すなわちF.prototype
を指す.実は、上記の考えは
Parent.prototype
の実現です.コードで説明:
function create (obj) {
let F = function(){}
F.prototype = obj
return new F()
}
Object.create()
のために、Child.prototype = new F()
などの指し示しを新たにする必要があります.function inheritPrototype (subType, superType) {
let prototype = Object.create(superType.prototype)
subType.prototype = prototype
prototype.constructor = subType
寄生コンビネーション引継ぎコードlet Parent = function(name){
this.name = name
this.staff = [1]
}
Parent.prototype.sayName = function(){
console.log(this.name)
}
Parent.prototype.showStaff = function(){
console.log(this.staff)
}
let Child = function(name){
Parent.call(this, name)
}
//Child.prototype = new Parent()
function inheritPrototype (subType, superType) {
let prototype = Object.create(superType.prototype)
subType.prototype = prototype
prototype.constructor = subType
}
inheritPrototype(Child, Parent)
let child1 = new Child(‘child1’)
child1.sayName()
let child2 = new Child(‘child2’)
child2.sayName()
child1.staff.push(2)
child1.showStaff()
child2.showStaff()
利益「JavaScript高級プログラム設計」表示:
このような方式の高効率化は、一度だけPartent構造関数を呼び出し、従ってPartent.prototype上に不必要な、余分な属性を作成することを回避する.それと同時に、プロトタイプチェーンはまだ変わらないです.そのため、instance ofとisProttypeOfを正常に使うことができます.開発者は寄生結合式継承が引用型の最も理想的な継承モデルと考えられている.
参考:https://github.com/mqyqingfeng/Blog/issues/16