童鞋们,咱们今天聊聊js的继承,关于继承,平时开发基本用不到,可是面试没有不考的,我就想问,这是人干的事吗?面试
好吧,迫于社会主义核心价值观,咱们今天就来简单说一说js的继承,谁让它是面向对象编程很重要的一个方面呢编程
首先一句定义,什么是继承:浏览器
A对象经过继承 B 对象,就能直接拥有 B 对象的全部属性和方法。函数
常见的集成方式有六种,咱们今天依次简单的说一下,如今让咱们把这六种方式分一下类,大体上可分为三类性能
第一类:普通类学习
这类继承方法有个特性,就是简单,容易实现,一共两种;spa
一、原型链继承prototype
关键点:子类型的原型为父类型的一个实例对象,子类继承父类的属性和方法是将父类的私有属性和公有方法都做为本身的公有属性和方法code
缺点:对象
没法实现多继承
来自原型对象的全部属性被全部实例共享
建立子类实例时,没法向父类构造函数传参
要想为子类新增属性和方法,必需要在Student.prototype = new Person()
以后执行,不能放到构造器中
二、借用构造函数继承
关键点:在子类型构造函数中通用call()调用父类型构造函数
缺点:
实例并非父类的实例,只是子类的实例
只能继承父类的实例属性和方法,不能继承原型属性和方法
没法实现函数复用,每一个子类都有父类实例函数的副本,影响性能
第二类:学习进化类
这类继承方法就比较牛了,若是说上面两种方式都是普通型的,那接下来咱们要介绍的就是那些经过学习其余类型身上的有点,改造本身不足的进化类型了,一共三种;
一、原型链+借用构造函数的组合继承
关键点:经过调用父类构造,继承父类的属性并保留传参的优势,而后经过将父类实例做为子类原型,实现函数复用
缺点:调用了两次父类构造函数,生成了两份实例
评价: 你看他就很牛了,他把上面的两种普通类型结合了,造成了本身独特的表现
二、(原型链+借用构造函数的组合继承)plus
关键点:这种方式经过父类原型和子类原型指向同一对象,子类能够继承到父类的公有方法当作本身的公有方法,并且不会初始化两次实例方法/属性,避免的组合继承的缺点。
缺点:没办法辨别是实例是子类仍是父类创造的,子类和父类的构造函数指向是同一个。
评价:这个类型就更厉害了,若是上一个类型是iPhone8,那这个就是8plus,他是在上一个版本的基础上,又自我进化了,修补了初始化两次实例方法和属性这个缺点。
三、(原型链+借用构造函数的组合继承)s
关键点:借助原型能够基于已有的对象来建立对象,var B = Object.create(A)
以A对象为原型,生成了B对象。B继承了A的全部属性和方法。
缺点:几乎进化到了完美形态!
评价:学习是永无止境的,苹果公司也继8plus以后推出了更强的手机系列,8s,又是一次进化;
第三类:天赋型
咱们要认可一件事,世上真的有天赋这个东西,接下来咱们要讲的天赋型就属于这种,它不一样于基础型和学习进化型,他是一种独树一帜的方式,而赋予它天赋的则来自ES6的class关键字,仅有一种;
一、ES6中class 的继承
关键点:经过extends关键字实现继承
缺点:它在有着以上全部优势的前提下,存在着一个缺点,相似于慧极必伤,那就是并非全部的浏览器都支持class关键字。
OK,开始敲黑板,以上三类六种就是咱们今天要说的js继承方法,固然三类是我胡诌的,只是但愿能加深你们的理解;
JS实现继承的几种方式
JavaScript深刻之继承的多种方式和优缺点
JavaScript常见的继承方式
阮一峰ES6入门之class的继承
JavaScript 常见的继承方式