如果没有继承
假如要写2个构造函数,他们有可能会有重复代码,如果没有继承,这些都要重新写一次
对象的继承方案
继承方案一:原型链继承
说明
(父类)(子类)
直接修改子类构造函数的原型
弊端
1、某些继承属性看不到
2、公共的属性,如果值是引用类型的(对象、数组)子类会相互影响
(friends是一个数组)
因为都是同一个引用,stu1.friends.push() 一开始会查找stu1有没有friends这个属性,没有,然后查找原型上有没有,有,然后往原型的数组上push,因此和自己是没有关系的。
3、不好传参数
这样传,你需要修改Student这个函数,这样他的父类Person就没意义了
我们想做的应该是Person里面传参数,但是p = new Person( ) 的时候就会定下来(如name),这样所有后面所有的学生都有共同的名字,也不是我们想要的
原型式继承函数
就是创建一个函数,给对象设置原型,
或
或者用ECMA较新的方法:Object.create( ) ,和上面功能一样的
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create
继承方案二:借用构造函数
说明
(call( )或apply( ))
优势
弊端
继承方案三:寄生式继承
最终继承方案四:寄生组合式继承
(父类)
(子类)
1、修改原型
2、修改类型,否则打印时类型是Person,因为student没有自己的constructor
3、再给子类定义自己的方法
4、创建具体的子类对象
(创建具体的子类对象)
5、
把1、2、重新封装一下,方便后面给其他不同对象继承
调用