javascript组合继承

 javascript继承有几种继承方式,现在来说说其中的组合继承。

    组合继承是结合了原型借用构造函数这两种技术的继承方式,分别利用它们的长处,避免了短处。那就先说说这两种技术吧。

原型链 

        原型链就是实例与原型之间的链条。

         子类型构造函数   与  超类型构造函数  之间没有关联,只需将   子类型构造函数的原型  作为  超类型构造函数的实例。这样,子类型构造函数的实例   就可以共享    超类型构造函数原型的方法  以及  超类型构造函数的属性              

  如:

   var subType.prototype = new superType();

         原型链的短处在于:当subType.prototype作为实例时拥有的superType构造函数里的属性,在它作为subType的原型时,这些属性就作为原型的属性被subType的实例共享;还有,因为两个类型的构造函数之间没有关联,在创建subType的实例时,不能向superType构造函数传递参数。

       

  借用构造函数

             在  子类型构造函数里  调用  超类型构造函数,使用   call()      或   apply()  方法。

如:

   superType.call(this);   或   superType.call(this,参数);

 

         通过这样可以将superType构造函数里的属性作为特定的,即subType的实例调用时,这些属性也是特属于每一个实例,而不是共享的。同时,还可以向superType构造函数传递参数。

         然而,定义在superType.prototype里的方法,对subType是不可见的。

         这两个方法都有其所长,也有其所短。所以将它们组合起来,这就有了组合继承。了解了原型链与借用构造函数就不难理解组合继承了。

 组合继承

         组合继承是通过原型链继承原型的方法,通过借用构造函数继承属性。这样就可以将属性与方法分开继承,方法被所有实例共享,而属性则是特属于每一个实例。

当然,组合继承也有其缺点,那就是超类型的属性被继承了两次,一次是子类型原型继承,另一次是子类型实例继承,只是实例继承的属性屏蔽了原型继承的属性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript有多种继承方式,以下是几种常见的方式: 1. 原型链继承:通过将父类实例赋值给子类的原型来实现继承。 ``` function Parent() { this.name = 'Parent'; } Parent.prototype.sayName = function() { console.log(this.name); } function Child() {} Child.prototype = new Parent(); var child = new Child(); child.sayName(); // 输出 Parent ``` 2. 构造函数继承:通过在子类构造函数中调用父类构造函数来实现继承。 ``` function Parent() { this.name = 'Parent'; } Parent.prototype.sayName = function() { console.log(this.name); } function Child() { Parent.call(this); } var child = new Child(); child.sayName(); // 报错,因为子类没有继承父类的原型方法 ``` 3. 组合继承:结合原型链继承和构造函数继承的方式。 ``` function Parent() { this.name = 'Parent'; } Parent.prototype.sayName = function() { console.log(this.name); } function Child() { Parent.call(this); } Child.prototype = new Parent(); Child.prototype.constructor = Child; var child = new Child(); child.sayName(); // 输出 Parent ``` 4. 寄生组合继承:对组合继承进行优化,避免了在子类原型上创建不必要的父类实例。 ``` function Parent() { this.name = 'Parent'; } Parent.prototype.sayName = function() { console.log(this.name); } function Child() { Parent.call(this); } Child.prototype = Object.create(Parent.prototype); Child.prototype.constructor = Child; var child = new Child(); child.sayName(); // 输出 Parent ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值