如何理解js的继承模式

发布时间:2021-10-28 15:27:17 作者:iii
来源:亿速云 阅读:127

本篇内容主要讲解“如何理解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的继承模式

从上图分析得到:

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

如何理解js的继承模式

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

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

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

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

推荐阅读:
  1. js中的继承
  2. 彻底理解js面向对象之继承

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

js

上一篇:Python中算术赋值-=操作是怎么实现的

下一篇:Mysql数据分组排名实现的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》