JS中的继承
大家都知道js中没有真正意义上的继承,但是我们可以通过js中的一些方法变通一下来实现继承
1.原型链继承(很少用):
特点:重写原型对象,父类原型对象上的属性和方法都会被子类继承
问题:1.父类中的实例属性一旦赋值给子类的原型属性,此时这些属性都属于子类的共享属性,在父类中定义的实例引用类型的属性,一旦被修改,其他子类的实例也会被修改
2.实例化子类型的时候,不能向父类型的构造函数传参
构造函数继承(经典继承或伪类继承,很少用):在子类的构造函数内部调用父类的构造函数,在子类构造函数内部间接调用(call(),apply(),bind())父类的构造函数
原理:改变父类中的this指向
优点:仅仅是把父类中的实例属性当做子类的实例属性,并且还能传参
缺点:父类定义的共享方法不能被子类所继承下来
组合模式
特点:结合了原型链继承和借用构造函数继承的优点
原型链继承:公有的方法能被继承下来
借用构造函数继承:实例属性能被子类继承下来
问题:无论在什么情况下,都会调用父类构造函数两次,一次是是我们初始化子类的原型对象的时候,另一次,在子类构造函数内部调用父类的构造函数
寄生组合式继承(开发过程中使用最广泛的一种继承模式)
原理:var b = Object.creat(a)
将a对象作为b实例的原型对象
把子类的原型对象指向了父类的原型对象
Dog.prototype=Object.create(Animal.prototype)
多重继承:一个对象同时继承多个对象
在js中多重继承概念是不存在,但可以通过变通方法实现
通过Object.assign(targetObj, copyObj);
将copyObj中的属性和方法copy到targetObj中
当然在最新出的ES6中,官方增加了extends关键字,用extends关键字就可以向Java一样很轻松的实现继承。这是我以前看得某位大佬的ES6的文档总结链接,里边写的非常清楚http://es6.ruanyifeng.com/#docs/class