前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >四种继承模式详解

四种继承模式详解

作者头像
子夜星辰
发布2022-11-15 16:21:54
2140
发布2022-11-15 16:21:54
举报
文章被收录于专栏:李白偷偷偷猪李白偷偷偷猪

目录

原型链继承:

借用构造函数:

共享原型:

圣杯模式:(继承模式集大成者,较完美解决方案)


本文介绍了继承模式逐步完善的过程,继承模式最终解决方案为--圣杯模式

原型链继承:

构造函数A通过new生成a对象,使得A.prototype指向对象b,而对象b由构造函数B生成,这样就形成了原型链的继承关系

单一,所以实例都会继承到父类实例的属性

a.__proto__ --> A.prototype === b b.__proto__ --> B.prototype

代码语言:javascript
复制
    Grand.prototype.lastName = 'Cheng';
    function Grand() {

    }

    var grand = new Grand();

    Father.prototype = grand;
    function Father() {
      this.name = 'ming';
    }

    var father = new Father();

    Son.prototype = father;
    function Son() {

    }

    var son = new Son();

    console.log(son.lastName);   // 'Cheng'
    console.log(son.name);     // 'ming'

借用构造函数:

通过call或者apply,在A的构造函数中执行调用B构造函数

执行了两次方法(缺点)

同原型链继承,过多的继承了无用的属性(缺点)

代码语言:javascript
复制
    function Person(name, age, sex) {
      this.name = name;
      this.age = age;
      this.sex = sex;
    }

    function Student (name, age, sex, grade) {
      Person.call(this, name, age, sex);
      this.grade = grade;
    }

    var student = new Student();

共享原型:

使得A.prototype = B.prototype

缺少个性化,如若想给A.prototype上面加自己的属性或方法,B.prototype也会加上

代码语言:javascript
复制
    Father.prototype.lastName = 'cheng';
    function Father() {

    }
    function son() {

    }
    // son.prototype = Father.prototype;
    function inherit(Target, Origin) {
      Target.prototype = Origin.prototype;
    }
    
    inherit(Son, Father);

    var son = new Son();
    console.log(son.lastName);  // 'cheng'

圣杯模式:(继承模式集大成者,较完美解决方案)

共享原型和原型链组合的方式

参数接收的分别是要继承的构造函数和被继承的构造函数,之所以参数设定构造函数,是因为这样之后由改构造函数产生的对象都会被继承

代码语言:javascript
复制
    // 接着共享原型改造 inherit
    function inherit(Target, Origin) {
      function F() {};
      F.prototype = Origin.prototype;
      Target.prototype = new F(); 
    // 至此功能已经实现,下面是便利使用
      Target.prototype.constuctor = Target;     //由于继承了Origin,target的结构体变成了Origin的,所以要重新赋值
      Target.prototype.uber = Origin.prototype;   //设置uber  当想知道继承自谁时,直接调用即可
    }

    //雅虎精简版
    var inherit = (function() {
      var F = function() {};
      return function(Target, Origin) {
        F.prototype = Origin.prototype;
        Target.prototype = new F();
        Target.prototype.constuctor = Target;
        Target.prototype.uber = Origin.prototype;
      }
    }());
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原型链继承:
  • 借用构造函数:
  • 共享原型:
  • 圣杯模式:(继承模式集大成者,较完美解决方案)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档