在学习JavaScript的一些总结和经验,供大家参考和学习,同时也欢迎大家参与讨论。
前言:继承的具体概念我就不讲了,很简单,就是爸爸有的特性(年龄、身高等),儿子也有,而儿子在长大的过程中,通过锻炼,可以形成一些爸爸没有的特性(跳舞、弹钢琴等),两者形成了父子关系,又可以有自己独立的特性,起到相辅相成的作用;
JavaScript继承
种类:
- 传统原型链继承
- 借用构造函数继承
- 组合继承
- 寄生组合式继承
- 循环拷贝继承
- JavaScript多继承
传统原型链继承
1 | function Father(name, age) { |
这种继承的本质就是重写子类(Son)的原型对象,原来存在于Father的实例中的所有方法和属性,现在也存在于Son.prototype中了
优点:
父类(Father)中的属性和方法以及Father原型上的属性和方法,子类(Son)都可以访问得到。
缺点:
原型对象(Son.prototype)上的引用类型值,会被所有实例共享。(例如上面的moeny,我们在上面的son1去push一个90,在下面使用son2.money输出[1000, 90],而不是[1000])
不能同时继承多个父类
在创建子类的实例时,不能向父类的构造函数中传递函数。
借用构造函数继承
1 | Father.prototype.makeMoney = function (money) { |
优点:
- 解决了传统原型链继承中共享引用类型属性的问题;
- 可以继承多个父类;
- 创建子类实例(son1、son2)的时候可以向父级传递参数;
缺点:
只能继承父类(Father)构造函数里面的属性和方法,不会继承父类原型(Father.prototype)上的属性方法;也就是说在父类原型对象中定义的方法,对子类而言是不可见的。
实例只是子类的实例不是父类的实例。
方法都在构造函数中定义,因此无法实现函数复用(就是每个子类都有父类实例的副本,比如上面的sayInfo方法,son1和son2都有各自的sayInfo,不是同一个,无法实现复用)
组合继承
通过调用父类的构造函数,继承父类构造函数内的属性方法,然后通过将父类实例作为子类原型继承父类原型上的属性和方法,实现函数复用
1 | Father.prototype.makeMoney = function (money) { |
优点:
- 实现函数复用
- 可以继承多个父类;
- 可以继承父类构造函数里面属性和方法,又可以继承父类原型属性和方法;
- 修改子类的引用类型值,不会影响父类(因为是父类实例作为子类原型对象)
缺点:
- 调用了两次父类的构造函数,产生了两份父类实例,多消耗了一点内存。
寄生组合式继承 / 圣杯模式继承
1 | Father.prototype.lastName = "yicong"; |
缺点:
- 不能实现多继承。
循环拷贝继承
1 | Father.prototype.makeMoney = function (money) { |
优点:
- 可以继承多个父类;
- 可以将父类的所有属性和方法(包括原型对象,当然前提是可枚举)均继承下来;
缺点:
- 效率较低;
- 实例不属于父类的实例。
JavaScript多继承
1 | Father.prototype.makeMoney = function (money) { |
1 | // 父类A |
参考:
https://mp.weixin.qq.com/s/V6F8vRYwKFOrkxhEkg7peA
文章标题: 39.JavaScript继承
文章作者: 王奕聪,QQ:1301842163
许可协议:
©署名-非商用-相同方式共享 4.0
