1. 原型继承(最常用)
让子类继承父类的方法:让子类的原型等于父类的实例
子.peototype=new 父
function A(){
this.x=100;
}
A.prototype.getX=function(){
console.log(this.x)
}
function B(){
this.x=100;
}
B.peototype=new A(); // 根据原型链 new A() 实例中存在A的所有的属性
A的所有属性覆盖B的原型,B就拥有A的所有属性
特点:把父类的私有+公有属性都继承到子类的原型上(子类公有属性)
原型继承原理.jpg
原型继承核心:
原型继承不是把父类的属性和方法克隆一份一样的给B,而是让B于A之间增加了原型链的连接,以后B中的实例想要使用A中的方法,只需要一级一级向上查找即可
2. call继承(利用构造函数中改变this的指向)
function A(){
this.x=100;
}
A.prototype.getX=function(){
console.log(this.x)
}
function B(){
A.call(this); //把A执行,让A中的this指向B中的this(指向B的实例),即B的实例有了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的实例,遍历A的所有的属性,把A的属性给B的实例当做B的实例的私有属性
call继承核心:
- 把父类的私有+公有属性和方法,克隆一份一模一样的作为子类的私有属性
- 注:for 循环可以循环私有属性也可以循环公有属性 只要是可枚举的
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继承