继承

前言:继承是面向对象语言中比较令人津津乐道的概念;许多面向对象语言实现继承都是有两种方式:接口继承和实现继承。由于EcmaScript没有签名函数,所以无法实现接口继承,只支持实现继承。。。。。。。
常见的继承方式如下:A()、B()
1、原型链继承
方式如下:B.prototype = new A();//B继承A
换句话说:子类的原型指向父类的实例;
优点:使用方便;可以动态的为父类添加属性和方法
缺点:为子类添加属性和方法是必须写在上面代码的后面;无法实现多继承;父类的属性和方法是共享的;无法传递参数;
:使用原型链继承时,不能使用对象字面量创建子类的原型方法。
2、借用构造函数继承
方式如下:function B(){
A.call(this);
}
换句话说:在B的构造函数中使用call或者apply改变this指向;
优点:可以传参;可以实现多继承;解决 共享问题
缺点:创建的实例是创建子类的实例,而不是父类的实例;只能继承构造函数中的属性,构造函数中的方式对于子类是不可见的;函数无法复用;
3、组合继承(伪经典继承)
方式如下:function B(){
A.apply(this,arguments);
}
B.prototype = new A();
B.prototype.constructor = B;
换句三句话说:在B中使用apply、call改变this指向;B的原型指向A的实例;B中原型属性中的constructor 指向B;
优点:避开了1、2两种实现继承的缺点,融合他们的优点;
缺点:父类函数被调用了两次;存在同名覆盖的问题。
4、原型式继承
方式如下:
function object(o){
function F(){}
F.prototype = o;
return new F();
}
也就是说:在object内部创建一个临时的构造函数,传入的参数作为这个构造函数的原型,返回临时构造函数的新实例。即必须有一个对象作为另一个对象的基础,把作为基础的对象传递过去。
5、寄生组合式继承
方式如下:
function B(){
A.apply(this,arguments);
}
function inheritPrototype(B,A){
var obj = object(A.prototype);//创建对象
obj.constructor = B;//增强对象
B.prototype = obj;//指定对象
}
也就是说:在B的构造函数中使用call 、apply调用父类的构造函数;
inheritPrototype函数中发生的事情:
(1)、创建超类型原型的一个副本
(2)、为创建的副本添加constructor属性,从而弥补因重写原型而失去的默认的constructor属性。
(3)、将创建的副本赋值给子类型的原型。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值