分为属性和方法的继承
组合继承:原型链继承+构造函数继承
使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,即通过在原型上定义方法实现了函数复用,又保证了每个实例都有它自己的属性。
1
2
3
4
5
6
7
|
function Parent(age){ this .name = [ 'mike' , 'jack' , 'smith' ]; this .age = age; } Parent.prototype.run = function () { return this .name + ' are both' + this .age; }; |
function Child(age){
Parent.call(this,age);
}
Child.prototype = new Parent();
缺点:调用2次父类的构造函数
原型式继承
借助原型并基于已有的对象创建新对象,同时还不用创建自定义类型。
1
2
3
4
5
|
function obj(o){ function F(){} F.prototype = o; return new F(); } |
寄生式继承
把原型式+工厂模式结合起来,目的是为了封装创建的过程
1
2
3
4
5
6
7
8
9
|
<script> function create(o){ var f= obj(o); f.run = function () { return this .arr; //同样,会共享引用 }; return f; } </script> |
寄生组合继承
通过借用构造函数来继承属性,通过原型链的混成方式来继承方法。
基本思路:不必为了指定子类的原型而调用超类型的构造函数。本质上,使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。
1
2
3
4
5
6
7
8
9
10
11
|
function object(o) { function F() {} F.prototype = o; return new F(); } function inheritPrototype(subType, superType) { var prototype = object(superType.prototype); //创建对象 prototype.constructor = subType; //增强对象 subType.prototype = prototype; //指定对象 } |