js继承------组合继承

组合继承

  • 又叫做伪经典继承
  • 是指: 将原型链和借用构造函数的技术组合到一块,发挥二者之长的一种继承模式。
  • 其背后的思路是: 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承
  • 既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。
    function SuperType(name) {
      this.name = name;
      this.color = ['red', 'blue', 'green']
    }
    // 创建一个方法
    SuperType.prototype.sayName = function () {
      console.log(this.name);
    }
    function SubType(name, age) {
      // 继承属性
      var subtype = this;
      SuperType.call(subtype, name);  // 这里如果不传递实参,就会undefined,相当于把SubType的name传递给SuperType的name
      this.age = age;
    }
    
   /*  
      用这种方法,确实可以将SuperType里面的原型对象赋给SubType,但是当我想在SubType里面添加属性和方法的时候
      
          SubType.prototype = SuperType.prototype  
      
      这一步已经指向了SuperType的原型对象,所以当想要在添加SubType的原型对象单独添加一个方法时候,不能采用这种方法 
   */
    SubType.prototype = new SuperType()
    /* 
        正确方式应该是
            SubType.prototype = new SuperType()
        这种方法的意思为,{
            var superType = new SuperType  // 创建一个superType实例化对象 可以利用 superType.__proto__来访问SuperType的原型对象
            所以当利用 SubType.prototype = supertype时候,首席按SubType会先在自己这里找,自己找不到就去Subtype.
            
            prototype里面找(等价于去new SuperType实例化里面找),如果还没有,就去SuperType的原型对象里面找
            (SubType -> SubType.prototype -> SubType.prototype.__proto__)
        }
     */
    
    SubType.prototype.constructor = SubType;
    /*
        因为上一步的操作,将 supertype = new SuperType() 的supertype 实例化 赋值给了 SubType.prototype 原型对象 所以在st实例化中,不存在constructor 在 st.__proto__ 中也就是 SubType 原型对象里面的construct 与supertype.constructor 的指向指向的是同一个 SuperType构造函数 也就证明了 st.__proto__.constructor 指向的是 SuperType构造函数 而不是 SubType

        所以要为 SubType 原型对象添加 constructor  指向 SubType 构造函数

      */


    SubType.prototype.myMoney = function() {
      console.log('我想要有钱')
    }
    var st = new SubType('zz',20)
    console.log(st);
    // console.log(st.__proto__);
    
    // 继承方法

在这里插入图片描述
一句话总结就是: 儿子想要爹的东西,但是儿子的东西又不想给爹,所以爹就把自己的东西放在实例对象的 篮子 里 给儿子,再把儿子原来有的东西放进去 儿子去爹的篮子拿,东西也往里面放。
Son.prototype = new Father()
Son.prototype.constructor = Son

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值