ES6 class类链式继承,实例化及react super(props)原理详解


Posted in Javascript onFebruary 15, 2020

本文实例讲述了ES6 class类链式继承,实例化及react super(props)原理。分享给大家供大家参考,具体如下:

class定义类是es6提供的新的api,比较直观,class类继承也有着一定的规律性,在egg, webpack等库的源码中有着很多的应用场景。结合一些初学者可能遇到的难点,本文主要对其链式继承进行总结,关于super关键字的使用请参考我的其他文章es6中super关键字的理解。

class定义

class App {
  constructor(options){
    super() //报错
    //console.log(options)
  }
}
 
class AppChild extends App{
  getConfig(){
    console.log('获取config')
  }
}

class定义类时,constructor不是必须的,可以省略

直接定义类时,不能再constructor中使用super()

class 链式继承

1,省略constructor:

class App {
  constructor(options){
    console.log(options)
  }
}
 
class AppChild extends App{
  getConfig(){
    console.log('获取config')
  }
}
 
class AppGrandson extends AppChild{
  getTime(){
    console.log('获取config')
  }
}
 
new AppGrandson({name:'ceshi'})

在对类进行实例化时,会逐级执行每个类的的constructor,如果类没有constructor,会去查找继承的类,在上层类实例化完毕之后(直到最顶层),再返回执行类的实例化。

看到这里是不是想起什么,是不是很像一些中间件的执行过程,先进入到最底层,执行完后再返回。是的,class类实例化过程类似于洋葱模型,先进后出。

所以上面的代码在最上层的类也能获取到传入的参数。

2,带有super的类继承

class App {
  constructor(options){
    console.log(options)
  }
}
 
class AppChild extends App{
  constructor(options){
    super({
      ...options,
      age:22
    })
    this.family = () => {
      return {
        familyName:'child'
      }
    }
  }
  getConfig(){
    console.log('获取config')
  }
}
 
class AppGrandson extends AppChild{
  getTime(){
    console.log('获取config')
  }
}
 
new AppGrandson({name:'ceshi'})

上面的代码在中间类添加了super(),super是什么呢,es6提供的关键字,用来继承的,具体用法参见:es6中super关键字的理解

加入super之后,最后顶层获取的options就被super修改了。这是为什么呢,通过调试可以发现,super()执行时,会去执行其所继承类的constructor,当父级类完成初始化之后,才会去执行super()之后的逻辑。

简单的说,super()是父级类实例化的入口

3,模拟实现react中class类,super(props)之后,可以使用this.props

class Component{
  constructor(options){
    console.log(options)
    //这里的this指的是实例化时入口类对应的实例
    //在用app进行实例化时,这里的this指的是App实例
    this.props = options
  }
}
 
class App extends Component{
  constructor(props){
    super(props)//去执行父级类的实例化
    console.log(this.props)
  }
  componentDidMount() {
    //...
  }
}
 
 
new App({name:'ceshi'})

实例化时,执行到super(props),去实例化Componet, 给this.props赋值,注意这时这里的this指的是App对应的实例,并不是Component,这是一个关键点。

当Component实例化后,再执行console.log(this.props),当然可以获取到值。

总结

1,class类实例化时,对应的this指向的是最外层类(入口类)对应的实例

2,链式继承对应的实例化是洋葱圈模型,先进入到最底层类实例化,再返回

3,super是class类constructor对应的入口,super(options)对应的参数就是constructor对应的参数

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jqPlot 基于jquery的画图插件
Apr 26 Javascript
js简易namespace管理器 实例代码
Jun 21 Javascript
js动态修改整个页面样式达到换肤效果
May 23 Javascript
js onmousewheel事件多次触发问题解决方法
Oct 17 Javascript
JavaScript获取页面中表单(form)数量的方法
Apr 03 Javascript
jQuery实现文本展开收缩特效
Jun 03 Javascript
javascript拖拽应用实例(二)
Mar 25 Javascript
JavaScript中的操作符类型转换示例总结
May 30 Javascript
JS实现浏览上传文件的代码
Aug 23 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
Sep 19 Javascript
iphone刘海屏页面适配方法
May 07 Javascript
Vue OpenLayer测距功能的实现
Apr 20 Vue.js
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
Feb 15 #Javascript
es6 super关键字的理解与应用实例分析
Feb 15 #Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
Feb 15 #Javascript
Vue父子传递实例讲解
Feb 14 #Javascript
Javascript操作select控件代码实例
Feb 14 #Javascript
微信小程序复选框实现多选一功能过程解析
Feb 14 #Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
Feb 14 #Javascript
You might like
德生H-501的评价与改造
2021/03/02 无线电
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
jquery UI 1.72 之datepicker
2009/12/29 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
python实现简单爬虫功能的示例
2016/10/24 Python
Python Tkinter实现简易计算器功能
2018/01/30 Python
Python实现的端口扫描功能示例
2018/04/08 Python
python破解zip加密文件的方法
2018/05/31 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
基于Python实现视频的人脸融合功能
2020/06/12 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
旅游专业职业生涯规划范文
2014/01/13 职场文书
法学院方阵解说词
2014/01/29 职场文书
总经理的岗位职责
2014/02/23 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
实习生辞职信范文
2015/03/02 职场文书
行政复议答复书
2015/07/01 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
用python实现监控视频人数统计
2021/05/21 Python