JavaScript 继承 - - 构造函数继承 + 缺陷

一、对比–对象原型继承(又称 原型链继承)

  • 对象原型继承的关键语句:Suber.prototype = new Super();

  • 存在的问题:引用值共享(无论是this对象 还是prototype对象上的引用值);

  • 构造函数继承:解决了 this对象上引用值共享的问题!

二、构造函数继承 的实现

- 特点:构造函数继承,继承的是原型的 this 对象,没有继承prototype对象

   //构造函数继承
    function Super() {
      this.pbrand = 'super';
      // 添加引用值
      this.a = [1, 2, 3, 4, 5];
    }
    function Suber() {
      this.bbrand = 'suber';
      //构造函数继承
      Super.call(this);      
    }

    let suber1 = new Suber();
    let suber2 = new Suber();

    suber1.pbrand = 'new super';
    console.log(suber1.pbrand); //new super
    
    //没有继承prototype对象
    console.log(suber1.__proto__.pbrand); //undefined
    console.log(suber2.__proto__.pbrand); //undefined
  • 构造函数继承的关键语句: Super.call(this);

三、Super.call(this)

    function Suber() {
      this.bbrand = 'suber';
      //构造函数继承
      Super.call(this);      
    }
    let suber1 = new Suber();
  • 首先、在 new Suber() 实例化过程中,this 对象指向 实例对象 suber1;

  • new Suber() 实例化过程执行代码:Super.call(this); , 相当于Super.call(suber1);

    执行Super.call(this)相当于suber1.pbrand = ‘super’; …因此原型上的属性(this对象)为每个实例对象私有,

    所以实例之间(suber1 /suber2)互不影响。

四、验证一下引用值不共享,


    //构造函数继承
    function Super() {
      this.pbrand = 'super';
      // 添加引用值
      this.a = [1, 2, 3, 4, 5];
    }
    function Suber() {
      this.bbrand = 'suber';
      //构造函数继承
      Super.call(this);      
    }

    let suber1 = new Suber();
    let suber2 = new Suber();

    suber1.a.push(8);
    
    console.log(suber1.a); //[1, 2, 3, 4, 5, 8]
    console.log(suber2.a); //[1, 2, 3, 4, 5]
    

五、缺点

  • prototype上的属性没有继承到

  • 并且不知道继承的是哪个对象,所以一般在构造函数继承中还会添加一条语句:

    //构造函数继承
    function Super() {
    this.pbrand = ‘super’;
    // 添加引用值
    this.a = [1, 2, 3, 4, 5];
    }
    function Suber() {
    this.bbrand = ‘suber’;
    //构造函数继承
    Super.call(this);
    }
    Suber.prototype = Super; //缺点,容易被后面定义Suber.prototype的属性覆盖,所以有了下局
    Suber.prototype.super = Super; //为了开发人员查看到它的父亲是谁,属性名随你自己命名
    在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值