JS之继承的实现方式及其优劣

1、原型链:让需要子类型原型对象等于超类型的实例。

优点:原型链很强大;

缺点:最主要的问题是如果有包含引用值类型的原型,则其属性会被所有实例共享;其次,在创建子类型的实例时,不能向超类型的构造函数中传参数。

2、借用构造函数:在子类型构造函数的内部调用超类型构造函数。

优点:可以在子类型构造函数中向超类型构造函数传递参数;

缺点:方法都在构造函数中定义,函数复用无从谈起;而且在超类型的原型中定义的方法,对子类型而言也是不可见的,结果所有类型都只能使用构造函数模式。

3、组合继承(伪经典继承):将原型链和借用构造函数的技术组合到一块。

优点:避免了原型链和借用构造函数的缺陷,并且融合了它们的优点;

缺点:需要调用两次超类型的构造函数。

4、原型式继承:先创建一个临时性的构造函数,然后传入的对象作为这个构造函数的原型,最后返回一个临时类型的新实例。

优点:在没有必要兴师动众地创建构造函数,而只想让一个对象与另一个对象保持类似的情况,原型式继承完全可以胜任;

缺点:包含引用类型值的属性始终都会共享相应的值。

5、寄生式继承:与原型式继承紧密相关,实现与工厂模式类似,即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真地是它做了所有工作一样返回对象。

优点:在主要考虑对象而不是自定义类型和构造函数的情况下,有用;

缺点:不能做到函数复用。

6、寄生组合式继承:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。

优点:只调用了一次超类型的构造函数,同时原型链还能保持不变,能够正常使用instanceof和isPrototypeOf();

缺点:暂无。

你可能感兴趣的:(JS之继承的实现方式及其优劣)