• JavaScript对象继承方式与优缺点


    一、借助构造函数实现继承

    子类构造函数中通过call执行父类构造函数并绑定this,可以实现私有属性的继承并且实例对象私有属性相互独立,缺点是无法继承父类的原型方法;

    function Parent1 () {
              this.name = 'parent1';
          }
          Parent1.prototype.say = function () {
    
          };
          function Child1 () {
              Parent1.call(this);
              this.type = 'child1';
          }
          console.log(new Child1(), new Child1().say());
    

    二、借助原型链实现继承

    子类原型对象指向父类实例,父类私有属性与原型方法都可以继承,缺点一是修改原型对象引用类型数据的值会影响其他实例对象,改变一个值会影响另一个(除非直接赋值改变引用,会创建新的副本);缺点二是无法通过instanceof判断实例对象是子类还是父类创建的(construtor都指向了父类)。

     function Parent2 () {
              this.name = 'parent2';
              this.play = [1, 2, 3];
          }
          function Child2 () {
              this.type = 'child2';
          }
          Child2.prototype = new Parent2();
    
          var s1 = new Child2();
          var s2 = new Child2();
          console.log(s1.play, s2.play);
          s1.play.push(4);
    

    三、构造函数+原型链组合方式

    结合两种方式的优势

     function Parent3 () {
              this.name = 'parent3';
              this.play = [1, 2, 3];
          }
          function Child3 () {
              Parent3.call(this);
              this.type = 'child3';
          }
          Child3.prototype = new Parent3();
          var s3 = new Child3();
          var s4 = new Child3();
          s3.play.push(4);
          console.log(s3.play, s4.play);
    

    组合继承优化

    1. 减少构造函数执行次数

    Child3.prototype = Parent3.prototype;

    1. 减少构造函数执行次数,同时指明子类实例的构造器(最优方案)
    Child3.prototype = Object.create(Parent3.prototype)(创建副本)
    Child3.prototype.constructor = Child3 // 重新绑定construtor
    
  • 相关阅读:
    jdbc(插入大对象及读取大对象、存储过程)
    jdbc批量插入操作(addBatch)
    javase(Properties集合及学生对象信息录入文本中案例)
    javase模拟斗地主洗牌和发牌(54)
    javase套接字编程
    javase网络编程
    javase多线程复制
    javase文件切割及融合
    设计原则
    模板方法模式
  • 原文地址:https://www.cnblogs.com/janas-luo/p/9605753.html
Copyright © 2020-2023  润新知