关于继承实现方式的一些思考

  • 刚开始我考虑共享原型的方式实现继承, 思路和代码如下

在这里插入图片描述

function Father() {}
function Son() {}

function inherit(Target, Origin) {
  Target.prototype = Origin.prototype;
}

inherit(Son, Father);
  • 但是由于共享原型的继承方式无法实现原型Son既继承原型Father的属性又同时拥有自己的独有属性 , 于是我考虑将子类的独有属性添加在一个在原型链上的对象身上, 所以考虑出如下方式实现继承

在这里插入图片描述

function Father() {}
function Son() {}

function inherit(Target, Origin) {
  Target.prototype = new Origin();
}

inherit(Son, Father);
  • 后经如下测试发现, 这种继承方式, 子类实例会共享父类构造函数的属性, 而非子类实例私有

    Father.prototype.lastName = 'liu';
    function Father() {
      this.name = 'father';
      this.hobby = ['swim', 'ball'];
    }
    
    Son.prototype = new Father();
    function Son() {
      this.name = 'son';
    }
    
    var tom = new Son();
    var bob = new Son();
    
    tom.hobby.push('sing');
    console.log(bob.hobby); // [ 'swim', 'ball', 'sing' ]
    
  • 圣杯模式实现的继承方式如下

在这里插入图片描述

  • 通俗写法

    function inherit(Target, Origin) {
      var F = function () {}
      F.prototype = Origin.prototype;
      Target.prototype = new F();
      Target.prototype.constructor = Target;
      Target.prototype.uber = Origin.prototype;
    }
    
  • 雅虎写法 , 结合闭包 , 将中间函数F私有化

    var inherit = (function () {
      var F = function () {}
      return function(Target, Origin) {
        F.prototype = Origin.prototype;
        Target.prototype = new F();
        Target.prototype.constructor = Target;
        Target.prototype.uber = Origin.prototype;
      }
    }())
    
发布了49 篇原创文章 · 获赞 29 · 访问量 1911

猜你喜欢

转载自blog.csdn.net/Brannua/article/details/104350017