JavaScript原型继承的几种方式

这是我根据 红宝石书 得到的几种方式

/**
     * 组合式继承
     * 缺点 两次调用父类的构造函数 效率比较低
     * 
    */

    function SuperType(name) {
      this.name = name
      this.colors = ['red', 'blue', 'green']
    }
    SuperType.prototype.sayName = function() {
      console.log(this.name)
    }
    function SubType(name, age) {
      // 第二次调用 会在其实例上添加 name、colors属性
      // 所以访问时 访问的是其实例上的属性 从而将其原型上的属性屏蔽了
      SuperType.call(this, name) 
      this.age = age
    }
    // 第一次调用 会在 SubType 的原型上添加 name 、colors属性
    SubType.prototype = new SuperType() 
    SubType.prototype.sayAge = function() {
      console.log(this.age)
    }
    let instance1 = new SubType("Nicholas", 23); 
    instance1.colors.push("black"); 
    console.log(instance1, 'instance1')

    let instance2 = new SubType("Greg", 11);
    console.log(instance2, 'instance2');

    /*
     * 原型式继承
     * 缺点 引用数据类型存在共享的问题
    */
    function objPrototype(obj) {
      function F() {}
      F.prototype = obj
      return new F()
    }
    let per = {
      name: 'xc',
      friends: ['Shelby', 'court', 'van']
    }

    let anotherPerson = objPrototype(per)
    anotherPerson.name = "Greg"; 
    anotherPerson.friends.push("Rob");
    
    let yetAnotherPerson = objPrototype(per); 
    yetAnotherPerson.name = "Linda"; 
    yetAnotherPerson.friends.push("Barbie");
    console.log(per.friends) // ["Shelby", "court", "van", "Rob", "Barbie"]
    
    // 可采用 Object.create()
    let anotherPersonObj = Object.create(per, {
      name: {
        value: 'hhh'
      }
    })
    

    /**
     * 寄生式继承
     * 缺点 方法挂载到实例上 占内存
    */
    function createAnother(obj) {
      let clone = Object(obj)
      clone.sayHi = function() {
        console.log('这是实例上的方法')
      }
      return clone
    }
    let perJs = { 
      name: "Nicholas", 
      friends: ["Shelby", "Court", "Van"] 
    }
    let anotherPersonJs = createAnother(perJs)
    anotherPersonJs.sayHi()
    console.log(anotherPersonJs, '寄生式继承')

    /**
     * 寄生组合式继承 官方推荐
     * 优点 引用数据不共享 只调用一次父类的构造函数
    */
    function inheritPrototype(subType, superType) {
      // subType 子类   superType 父类
      let prototype = Object(superType.prototype)
      prototype.constructor = subType
      subType.prototype = prototype
    }

    function SuperType1(name) {
      this.name = name
      this.colors = ['blue', 'red']
    }
    SuperType1.prototype.sayName = function() {
      console.log(this.name)
    }
    function SubType1(name, age) {
      SuperType1.call(this, name)
      this.age = age
    }
    inheritPrototype(SubType1, SuperType1)
    SubType.prototype.sayAge = function(){ 
      alert(this.age); 
    }
    let sub = new SubType1('xc', 23)
    console.log(sub,'寄生组合式继承') 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超帅不是很帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值