先让我们从零谈起吧
- 方法直接挂在构造函数上,会存在一个问题。就是,每个实例中的方法都是一个新的方法实例,不能够复用。
因此,原型就应运而生了。 - 方法挂在原型上,这样所有的实例共享这些方法。但是,原型上的引用值,也会被所有实例共享,这是原型的一个特点吧。原型还具有动态性,对象创建后,修改原型(增加方法或属性等),该对象访问的是修改后的原型。注意重写原型,会导致重写前创建的对象,与重写后的原型切断关系。
那Js 中怎么实现继承呢
是通过原型链。一个类型的原型是另一个类型的一个实例,这样就构建了原型链。实现了,子类继承父类的属性和方法。
- 原型链构建完毕,我们会发现一个问题。与原型问题相似,原型上的引用值被全部实例共享,此外子类实例化时不能向父类构造函数传参。
- 解决1中的问题,可以使用构造函数。但是又引入了一个新问题,就是切断了子类的原型链,子类不能继承父类原型上的属性或方法了。
- 使用组合继承可以解决2中的问题即使用盗用构造函数和原型链。
- 组合继承中,父类型的构造函数需要执行两次。为了提高效率,出现了寄生组合继承。即子类的原型对象通过寄生方式获得。
- 原型继承即Object.create(obj),这种继承无需编写子类构造函数,就可以实现继承。
- 寄生继承,即是对原型继承的封装,相当于工厂模式。