1. 原型繼承(最常用)
讓子類繼承父類的方法:讓子類的原型等于父類的實(shí)例
子.peototype=new 父
function A(){
this.x=100;
}
A.prototype.getX=function(){
console.log(this.x)
}
function B(){
this.x=100;
}
B.peototype=new A(); // 根據(jù)原型鏈 new A() 實(shí)例中存在A的所有的屬性
A的所有屬性覆蓋B的原型,B就擁有A的所有屬性
特點(diǎn):把父類的私有+公有屬性都繼承到子類的原型上(子類公有屬性)
原型繼承核心:
原型繼承不是把父類的屬性和方法克隆一份一樣的給B,而是讓B于A之間增加了原型鏈的連接仆救,以后B中的實(shí)例想要使用A中的方法,只需要一級一級向上查找即可
2. call繼承(利用構(gòu)造函數(shù)中改變this的指向)
function A(){
this.x=100;
}
A.prototype.getX=function(){
console.log(this.x)
}
function B(){
A.call(this); //把A執(zhí)行,讓A中的this指向B中的this(指向B的實(shí)例),即B的實(shí)例有了A中的方法
}
var n=new B()
call繼承核心:
把父類的私有屬性和方法,克隆一份一模一樣的作為子類的私有屬性
3. 冒充對象繼承
function A(){
this.x=100;
}
A.prototype.getX=function(){
console.log(x)
}
function B(){
var temp=new A;
for(var key in temp){
this[key]=temp[key]
}
}
var n=new A();
//獲取A的實(shí)例嬉探,遍歷A的所有的屬性擦耀,把A的屬性給B的實(shí)例當(dāng)做B的實(shí)例的私有屬性
call繼承核心:
- 把父類的私有+公有屬性和方法,克隆一份一模一樣的作為子類的私有屬性
- 注:for 循環(huán)可以循環(huán)私有屬性也可以循環(huán)公有屬性 只要是可枚舉的
4. 混合模式繼承
- 原型繼承+call繼承
function A(){
this.x=100;
}
A.prototype.getX=function(){
console.log(x)
}
function B(){
A.call(this);
}
B.prototype=new A();
混合模式繼承核心:
- 把父類的私有+公有屬性和方法繼承為自己公有的屬性
- 把父類私有的屬性繼承為自己私有的屬性
5. 寄生組合式繼承
B.prototype=Object.creat(A.prototype)
寄生組合式繼承的核心
A的原型作為B的原型
- 模擬Object.creat()
var obj={
getX:function(){
console.log('aa')
}
}
function object(B){
function Fn(){
}
Fn.prototype=B;
return new Fn();
}
var a=object(obj)
//a的原型上就有obj的屬性
6.
new B.__proto__==A.prototype//有兼容問題
argumets.__proto__=Array.prototype
6. 拷貝繼承
冒充對象繼承+call繼承