继承的五种方式

131 阅读2分钟
  1. 原型链继承(prototype属性/直接继承prototype)
  • 原型链就是一层一层向上找的过程
  • 原型链继承就是利用了上面这种特性
重点:★让新实列的原型等于父类的实例。
特点:实例可继承的属性:
      1.实例的构造函数的属性
      2.父类的构造函数属性
      3.父类原型属性
缺点:1.新实例无法向父类构造函数传参
      2.继承单一
      3.所有新实列都会共享父类实例的属性
      (子级的任何原型属性修改,都会影响到父级原型属性)
在这的constructor不会指向自己
  1. 空对象作为中介
空对象,几乎不占内存
修改子级的对象,不会影响到父级
★constructor构造器都是指向自己的
  1. 构造函数绑定apply/call方法
重点:★用.call()和.apply()将父类构造数引入子类函数
特点:1.call,apply是用来改变this指向的,理解为是函   数自身的方法
   2.只继承父元素构造函数的属性,没有继承父类原型
   3.解决了原型链继承缺点1234.可以继承多个构造函数属性(call多个)
   5.在子实例中可向父实例传参。
 缺点:无法实现构造函数的复用(每次用每次都要重新调用)
call,apply区别
使用call方法来传参 一个一个的传参
使用apply方法来传参 需要传一个数组
  1. 组合继承也叫伪经典继承
重点:将原型链继承和构造函数继承组合在一块
     原型链实现对原型属性和方法的继承
     借用构造函数实现对实例属性的继承
特点:1.可以继承父类原型上的属性,可以传参,可复用。
     2.每个新实例引入的构造函数属性是私有的。
缺点:调用了两次父类构造函数(耗内存)
      子类的构造函数会代替原型上的那个父类构造函数。


  1. 拷贝继承
把父对象的所有属性和方法,拷贝进子对象
将父对象的prototype对象中的属性
拷贝给Child对象的prototype对象
function Person(){
 Car.prototype.head=1;
 Car.prototype.foot=2;
 person.prototype.eat=function(){
     document.write(`我会吃饭`)
     }
   function Student(){}
   function extend(child,parson){
    for(let key in parson.prototype){
     child.prototype[key]=parson.prototype[key];
     }
   }
   extend(Student,Person) 
   let bl=new Student();
   bl.eat();