我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解js的继承模式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解js的继承模式

本篇内容主要讲解“如何理解js的继承模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解js的继承模式”吧!

一、前言

相信很多人在遇到面试中都遇到过被问到过JavaScript继承模式的问题,都能手写出几种继承模式的代码例子,但为什么面试官却对你的回答不是很满意或者压根就没听懂,个人觉得应该是缺少自己的一个答题的思路。

二、答题技巧

  第一,按照几种继承模式的从最次的继承模式到最佳的继承模式的顺序去讲

  第二,讲出当前这种继承模式的利弊,相对前一种继承模式解决了什么问题,最关键的代码部分在哪里

以下着重讲一下几种常见的几种继承模式

二、原型链继承

代码示例

function Parent (sex) {      this.sex = sex  }  Parent.prototype.setSex = function () {}  function Son (name) {      this.name = name  }  Son.prototype = new Parent()  var s1 = new Son('DBCDouble')  console.log(s1)

结果打印

如何理解js的继承模式

关键:把子类的原型指向父类的实例,从而继承父类的私有属性和原型属性

优点:

  •  父类新增原型属性和方法,子类实例都能访问到

  •  简单、易用

缺点:

  •  无法实现多继承(一个子类继承成多个父类)

  •  创建子类实例的时候,无法向父类构造函数传参

  •  有子类实例共享父类引用属性的问题(因为子类的原型指向的是父类的一个实例,假如父类的私有属性有一个是数组(引用类型),那么任一子类都可以操作这个数组,从而导致其他子类使用的这个数组也会发生变化)

四、借用父类构造函数继承

代码示例

function Parent (sex) {      this.sex = sex  }  Parent.prototype.setSex = function () {}  function Son (name, age, sex) {      Parent.call(this, sex)      this.name = name      this.age = age  }  var s1 = new Son('DBCdouble', 25, '男')  console.log(s1)

结果打印

如何理解js的继承模式

关键:在子类构造函数中使用call或者apply调用父类构造函数实现父类私有属性继承(函数复用)

优点:

  •  创建子类实例时,可以向父类传递参数

  •  可以实现多继承(在子类构造函数调用多个父类构造函数)

  •  解决了原型链继承中子类实例共享父类引用属性的问题(即使父类构造函数中有引用类型,在创建子类实例时,都会重新调用父类构造函数重新创建一份这个引用类型数据,重新申请引用类型的空间)

缺点:

  •  每次创建子类实例时,都要调用一次父类构造函数,影响性能

  •  只继承父类的实例属性(私有属性),没有继承父类的原型属性

五、组合式继承(原型链继承 + 借用构造函数继承)

代码示例

function Parent (sex) {      this.sex = sex  }  Parent.prototype.setSex = function () {}  function Son (name, age, sex) {      Parent.call(this, sex)      this.name = name      this.age = age  }  Son.prototype = Object.create(Parent.prototype)  SonSon.prototype.constructor = Son  var s1 = new Son('DBCdouble', 25, '男')  console.log(s1)

打印结果

如何理解js的继承模式

关键:通过调用父类构造函数,继承父类的属性并保留传参的优点,并通过Object.create(Parent.prototype)来创建继承了父类原型属性的对象,并把这个对象赋给子类的原型,这样的话,既能保证父类构造函数不用执行两次,又能让子类能继承到父类的原型方法

优点:

  •  创建子类实例时,可以向父类传递参数

  •  可以实现多继承(在子类构造函数调用多个父类构造函数)

  •  解决了原型链继承中子类实例共享父类引用属性的问题(即使父类构造函数中有引用类型,在创建子类实例时,都会重新调用父类构造函数重新创建一份这个引用类型数据,重新申请引用类型的空间)

  •  父类构造函数只用执行一次

六、ES6的class继承

ES6中引入了class关键字,class可以通过extends关键字实现继承,还可以通过static关键字定义类的静态方法,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。

注意:ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.apply(this))。ES6 的继承机制完全不同,实质是先将父类实例对象的属性和方法加到this上面(所以必须先调用super方法),然后再用子类的构造函数修改this。

代码示例

class A {    constructor (sex) {      this.sex = sex    }    showSex () {      console.log('这里是父类的方法')    }  }  class B extends A {    constructor (name, age, sex) {      super(sex);      this.name = name;      this.age = age;    }    showSex () {      console.log('这里是子类的方法')    }  }  const b = new B('DBCDOUBLE', 25, '男')  console.log(b);

打印结果

如何理解js的继承模式

关键:使用extends关键字继承父类的原型属性,调用super来继承父类的实例属性,且保留向父类构造函数传参的优点

优点:简单易用,不用自己来修改原型链来完成继承

我们通过将代码从ES6编译到ES5来看看到底,class继承的代码最终会被编译成什么样,如下:

如何理解js的继承模式

从上图分析得到:

  •  上述代码示例中的super指的就是父类构造函数

  •  子类继承父类的实例属性最终还是通过call或者apply来实现继承的

  •  通过extends方法的调用来修改子类和父类的原型链关系

再看经过编译后的extends方法,如下

如何理解js的继承模式

  1、注意Object.setPrototypeOf()方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null。

  2、(.prototype = b.prototype, new ())表达式的执行执行顺序是先执行前者,再返回后者

从上图可知,extends做了以下几件事:

  •  定义了一个function __() {}函数,并把该函数的constructor指向了子类

  •  紧接着,把function __() {} 函数的原型指向了父类的原型

  •  最后再把function () {} 函数的实例赋给了子类函数,就这样子类的实例就能沿着proto.proto获取到父类的原型属性了,这种继承模式俗称圣杯模式 

到此,相信大家对“如何理解js的继承模式”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解js的继承模式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何理解PHP类的继承

如何理解PHP类的继承,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。PHP类的继承在PHP语言的学习中是一个比较重要的知识点。那么我们该如何正确的学习PHP类的继承呢?在P
2023-06-17

css样式不继承如何解决

这篇文章主要介绍“css样式不继承如何解决”,在日常操作中,相信很多人在css样式不继承如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css样式不继承如何解决”的疑惑有所帮助!接下来,请跟着小编一起来
2023-07-06

如何理解VB.NET继承规则

如何理解VB.NET继承规则,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。VB.NET中也有继承相关应技术,而且相对于初学者来说并不是很好理解这一应用。下面就首先让我们从VB.
2023-06-17

如何使用Python继承实现单例模式

这篇文章给大家分享的是有关如何使用Python继承实现单例模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。继承实现:class ParentClass: def __new__(cls, *args, *
2023-06-17

Entity Framework如何使用Code First的实体继承模式

这篇文章主要介绍Entity Framework如何使用Code First的实体继承模式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Entity Framework的Code First模式有三种实体继承模式1、
2023-06-29

如何正确的理解Java中的继承

本篇文章为大家展示了如何正确的理解Java中的继承,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java作为一面向对象的语言,具备面向对象的三大特征——继承,多态,封装。继承顾名思义,继任,承接,传
2023-05-31

C++ 函数继承详解:如何处理继承中出现的二义性?

解决继承中的二义性存在同名函数时,可以通过以下方法解决二义性:使用作用域解析符(::)指定函数所属的类。在派生类中重写基类函数。创建基类指针并指向派生类对象,然后使用指针调用基类函数。C++ 函数继承详解:处理继承中的二义性继承中的二义性
C++ 函数继承详解:如何处理继承中出现的二义性?
2024-04-30

C++ 函数继承详解:如何理解继承中的“is-a”和“has-a”关系?

C++ 函数继承详解:掌握“is-a”和“has-a”关系什么是函数继承?函数继承是 C++ 中一种将派生类中定义的方法与基类中定义的方法关联起来的技术。它允许派生类访问和重写基类的方法,从而扩展了基类的功能。“is-a”和“has-
C++ 函数继承详解:如何理解继承中的“is-a”和“has-a”关系?
2024-05-02

C++ 函数继承详解:如何使用继承实现插拔式架构?

函数继承允许派生类覆盖基类的函数,避免代码重复。实现方法:在派生类函数前使用 override 关键字。实战案例:插拔式架构中,插件类作为基类,派生类提供插件实现,通过 pluginmanager 类动态加载和运行插件。C++ 函数继承详解
C++ 函数继承详解:如何使用继承实现插拔式架构?
2024-05-02

C++ 函数继承详解:如何使用继承实现代码解耦和模块化?

函数继承是一种 c++++ 机制,可通过派生新函数从基类覆盖函数,实现代码解耦和模块化。好处包括:代码解耦:分离基类和派生类的代码。模块化:将功能分解为单个模块,提高可重用性。可扩展性:在不修改原有代码的情况下添加新功能。代码重用:可在子类
C++ 函数继承详解:如何使用继承实现代码解耦和模块化?
2024-05-03

C++ 函数继承详解:如何使用模板继承来实现泛型代码复用?

c++++ 函数继承通过模板继承实现泛型代码复用,允许创建通用函数模板,然后继承更具体的函数,定制不同的数据类型行为。代码示例包括打印容器函数,通过继承定制打印整数和字符串容器。函数继承增强代码复用、可读性、可维护性,以及通过继承类轻松扩展
C++ 函数继承详解:如何使用模板继承来实现泛型代码复用?
2024-05-04

C++ 函数继承详解:如何调试继承中出现的错误?

继承错误调试技巧:确保正确的继承关系。使用调试器逐步执行代码,检查变量值。确保正确使用 virtual 修饰符。检查隐藏的继承带来的菱形继承问题。检查抽象类中未实现的纯虚函数。C++ 函数继承详解:轻松调试继承错误简介继承是 C++ 中
C++ 函数继承详解:如何调试继承中出现的错误?
2024-05-02

编程热搜

目录