Javascript的继承
其他的OO语言继承都有两种方式:实现继承,签名继承。JS因为函数没有签名所以JS只有实现继承。
一、原型链继承
原理:让子类的原型指向父类的实例
优点/特点:
1、非常纯粹的继承关系,实例是子类的实例,也是父类的实例
2、简单容易实现
3、父类的原型上新增属性和方法子类都可以访问到
缺点:
1、继承单一,无法实现多继承
2、新实例无法向父类传递参数
3、想要修改子类的原型必须在Son.prototype=new Parent()之后,否则无效。
4、所有新实例都会共享父类实例的属性
5、引用类型属性会存在子类更改了父类的,其他子类会受到影响
二、借用构造函数继承
原理:在子类内部调用父类,利用函数.call和apply改变this指向
特点/优点:
1、子类可以向父类传递参数
2、可以实现多继承
3、所有子类不会共享父类的属性
缺点:
1、无法实现父类的方法共享
2、无法继承父类原型上的方法和属性
3、实例不是父类的实例,是子类的实例
三、组合继承(原型链继承和借用构造函数接触组合)
原理:使用借用构造函数继承父类的属性,使用原型链方式继承父类的方法
优点/特点:每个新实例的构造函数上的属性都是私有的,方法实现共享
缺点:小瑕疵,调用了两次父类的构造函数(耗内存)
四、原型式继承
原理:用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。object.create()就是这个原理
优点/特点:
1、不限制调用方式
2、简单,易实现
3、父类必须是一个对象
缺点:
1、新的实例没有用new构建出来
2、子类的属性没有私有化,某个子类更改以后会影响父类和其他子类(引用类型更不用说)
五、寄生式继承
原理:就是在原型式继承上面套了一层壳
特点/优点:没有创建自定义类型,因为只是套了个壳子返回对象(这个),这个函数顺理成章就成了创建的新对象。
缺点:没用到原型,无法复用。
六、组合寄生式继承(目前最完美的继承方式)
原理:利用寄生式继承解决了组合继承调用了两次父类构造函数的小瑕疵。
这是目前最完美的继承方式,es6的继承就是根据这个继承方式来的
七、ES6的继承方式
用法:构造函数必须使用class关键字创建,用关键字extends实现继承,在子类中必须使用super(),要向父类传递参数需要在这个函数里传递就可以了
ES6的继承原理是跟ES5的寄生式组合继承差不多,只是实现的方式不太一样,感兴趣的同学可以去看看ES6继承的实现原理