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 相关文章推荐
使用JavaScript switch case 另类写法
Mar 14 Javascript
Jquery UI震动效果实现原理及步骤
Feb 04 Javascript
javascript单引号和双引号的区别和处理
May 14 Javascript
详解Javascript动态操作CSS
Dec 08 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
Dec 19 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
Mar 04 Javascript
微信小程序 页面之间传参实例详解
Jan 13 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
Jun 07 Javascript
js实现图片轮播效果学习笔记
Jul 26 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
Jul 05 Javascript
js实现百度淘宝搜索功能
Feb 17 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
Oct 27 Javascript
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
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
JavaScript实现短暂提示框功能
2018/04/04 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
vue3中轻松实现switch功能组件的全过程
2021/01/07 Vue.js
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
飞利浦法国官网:Philips法国
2019/07/10 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
德国家具折扣店:POCO
2020/02/28 全球购物
学前教育毕业生自荐信
2013/10/29 职场文书
档案接收函
2014/01/13 职场文书
竞聘上岗演讲
2014/05/19 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
超强台风观后感
2015/06/09 职场文书
2015年社区消防安全工作总结
2015/10/14 职场文书
亲情作文之母爱
2019/09/25 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
Mysql数据库group by原理详解
2022/07/07 MySQL