1. 原型链
方法
将原型对象的指针指向另一个类的实例。1
2
3
4
5
6
7
8
9
10
11
12
13
14function SuperType() {
this.name = "SuperType";
}
SuperType.prototype.getSuperName = function() {
return this.name;
}
function SubType() {
}
SubType.prototype = new SuperType();
var sub = new SubType();
console.log(sub.getSuperName());
注意使用
- 用原型链实现继承时,==不能使用对象字面量创建原型方法==,这样会重写原型链。如下:
1 | function SuperType() { |
- 若子类要覆盖超类中的方法,或添加自己的方法,添加方法的代码要放在替换原型的语句之后。
1 | function SuperType() { |
问题
- 若包含引用类型,不可通过原型链的方式来实现继承。原型中定义的属性和方法会在所有实例中共享。
1 | function SuperType() { |
- 在创建子类实例时,不可向超类构造函数传递参数。
2. 借用构造函数
1 | function SuperType() { |
借用构造函数可向父类构造函数中传递参数。
1 | function SuperType(type) { |
3. 组合继承
1 | function SuperType(type) { |
- 缺点
组合继承会调用两次超类构造函数。
4. 原型式继承
借助原型,基于已有对象创建新对象
1 | function object(obj) { |
ECMAScript5 新增Object.create()方法规范原型式继承。
问题
- 所有子类实例共享父类属性
- 无法实现函数复用
5. 寄生式继承
创建一个仅用于封装继承过程的函数,在函数内部以某种方式增强对象,后返回该对象
1 | function createObj(obj) { |
- 缺点
未实现函数复用
6. 寄生组合式继承
- 通过借用构造函数来继承属性,通过原型链的混合形式来继承方法。
1 | function inherPrototype(subType, superType) { |
- 改进
仅调用一次超类构造函数。