如果没有继承

假如要写2个构造函数,他们有可能会有重复代码,如果没有继承,这些都要重新写一次
image.png image.png

对象的继承方案

继承方案一:原型链继承

说明

image.png(父类)image.png(子类)
直接修改子类构造函数的原型

image.png

弊端

1、某些继承属性看不到
image.png
image.png

2、公共的属性,如果值是引用类型的(对象、数组)子类会相互影响
image.png(friends是一个数组)
image.png
因为都是同一个引用,stu1.friends.push() 一开始会查找stu1有没有friends这个属性,没有,然后查找原型上有没有,有,然后往原型的数组上push,因此和自己是没有关系的。

3、不好传参数
image.png
这样传,你需要修改Student这个函数,这样他的父类Person就没意义了
image.png
我们想做的应该是Person里面传参数,但是p = new Person( ) 的时候就会定下来(如name),这样所有后面所有的学生都有共同的名字,也不是我们想要的

原型式继承函数

image.png
就是创建一个函数,给对象设置原型,
image.pngimage.png
image.png

或者用ECMA较新的方法:Object.create( ) ,和上面功能一样的
image.png
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create

继承方案二:借用构造函数

说明

image.png
image.png(call( )或apply( ))

优势

一次解决方案一的三个弊端
image.png
image.png
image.png

弊端

image.png
image.png

继承方案三:寄生式继承

image.png
image.png

最终继承方案四:寄生组合式继承

image.png(父类)

image.png(子类)
1、修改原型
image.png

2、修改类型,否则打印时类型是Person,因为student没有自己的constructor
image.png

3、再给子类定义自己的方法
image.png

4、创建具体的子类对象
image.png(创建具体的子类对象)

5、
把1、2、重新封装一下,方便后面给其他不同对象继承
image.png
调用
image.png