js继承的几种方式

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继承核心:

  1. 把父类的私有+公有属性和方法,克隆一份一模一样的作为子类的私有属性
  2. 注:for 循环可以循环私有属性也可以循环公有属性 只要是可枚举的

4. 混合模式继承
  • 原型继承+call继承
function A(){
  this.x=100;
}
A.prototype.getX=function(){
  console.log(x)
}
function B(){
  A.call(this);
}
B.prototype=new A();

混合模式继承核心:

  1. 把父类的私有+公有属性和方法继承为自己公有的属性
  2. 把父类私有的属性继承为自己私有的属性
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继承



继承方式多种多样,只要熟悉原型链方式很多,比较灵活。

你可能感兴趣的:(js继承的几种方式)