ECMAScript 中只支持实现继承,而且主要依靠的是原型链来实现。
扩展原型对象实现继承
- 描述:直接在构造函数的prototype属性上添加方法
- 解决的问题:解决了直接将方法设置在构造函数上时,实例化每个对象这些方法都会开辟新空间,造成内存严重浪费的问题
- 缺点:如果将所有的方法都直接设置到原型对象上,代码冗余
1 | /* 一、 扩展原型对象实现继承 */ |
替换原型对象实现继承
- 描述:将构造函数的原型对象用新对象替换,再往新的对象中添加新方法
- 解决的问题:扩展原型对象使得代码冗余
- 缺点:所有的方法和属性都被实例共享
- 注意:还原构造器
1 | /* 二、 替换原型对象实现继承 */ |
另一种原型继承(动态原型模式) 特点:让代码封装到一起
1 | /* 二、 另一种原型继承(动态原型模式) 特点:让代码封装到一起 */ |
混入继承: 已知两个对象,一个对象继承另一个对象的功能,for..in
- 描述: jQuery的extend()方法原理是混入继承
1 | /* 三、 混入继承: 已知两个对象,一个对象继承另一个对象的功能,for..in */ |
原型+混入继承:混入继承的应用
- 描述:在一个对象的原型对象上扩展另一个对象的属性和方法
- jQuery.fn.extend() 利用的原理是原型+混入继承
1 | /* 四、 原型+混入继承:混入继承的应用 */ |
经典继承:已知一个对象knownObj,需要创建一个新对象,这个新对象继承自已知的对象knownObj
- 注意: ES5 Object.create()方法的实现原理就是经典继承
1 | /* 五、 经典继承:已知一个对象knownObj,需要创建一个新对象,这个新对象继承自已知的对象knownObj */ |
借用构造函数实现继承
- 特点: 不会继承原型对象上的方法,因为this的指向变了,原型对象上的方法只能通过构造函数的实例来访问
1 | /* 六: 借用构造函数实现继承 */ |
混合继承(经典继承+借用构造函数)
- 特点:解决借用构造函数继承不能够继承原型对象上的方法的问题
- 缺点:继承了两次构造函数(模板)
1 | /* 七、 混合继承(经典继承+借用构造函数)*/ |
解决混合继承的缺点
1 | /* 八、 解决混合继承的缺点 */ |