如果父类是通过混合模式声明的,子类如何继承?

如果父类是通过混合模式声明的,子类如何继承?

function Animal(name,age,color){
    this.name = name
    this.age = age
    this.color = color
}
Animal.prototype = {
    type: 'pet',
    say : function(){
        console.log('hi~~')
        console.log('color:' + this.color)
    }
}

function Cat(name, age, color) {
    Animal.apply(this, arguments)
}
Cat.prototype = new Animal()
Cat.prototype.constructor = Cat

var cc = new Cat('qiuqiu',3,'black')
console.log(cc.name)
console.log(cc.type)
cc.say()


http://img1.sycdn.imooc.com//climg/5cde7fbc0001015b04750366.jpg


http://img1.sycdn.imooc.com//climg/5cde7fe200016c3c04310174.jpg


如果父类是通过混合模式声明的,那么子类继承的时候也要继承两次吗?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学的理解是可以的,混合声明子类继承:将原型链和借用构造函数的技术组合在一起。原理是:使用原型链实现对原型属性和方法的继承,而通过借用构造函数实现对实例属性的继承

优点:

(1)可以继承实例属性/方法,也可以继承原型属性/方法

(2)既是子类的实例,也是父类的实例

(3)不存在引用属性共享问题

(4)通过call继承父类的基本属性和引用属性并保留能传参的优点

(5)函数可复用

缺点:子类原型上有一份多余的父类实例属性,因为父类构造函数被调用了两次,生成了两份,而子类实例上的那一份屏蔽了子类原型上的。

希望可以帮到你!


  • a_agiao 提问者 #1
    那么 如果将Cat.prototype = new Animal() 改成Cat.prototype = Animal.prototype 是不是就解决了这个问题,不实例化父类,直接将子类原型指向父类原型
    2019-05-17 20:28:09
  • a_agiao 提问者 #2
    子类: 1)构造函数里使用call/apply。 2)子类原型对象指向父类原型对象。 这样分别来获取父类的基本属性/方法,和 原型属性/方法。
    2019-05-17 20:33:46
  • 卡布琦诺 回复 提问者 a_agiao #3
    一般都是继承两次,不过同学可以测试一下将Cat.prototype = new Animal() 改成Cat.prototype = Animal.prototype,能否继承成功
    2019-05-18 11:59:05
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师