分为属性和方法的继承
组合继承:原型链继承+构造函数继承
使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,即通过在原型上定义方法实现了函数复用,又保证了每个实例都有它自己的属性。
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;
//指定对象
}
|