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中2个感叹号的用法实例详解
Sep 04 Javascript
Windows系统下Node.js的简单入门教程
Jun 23 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
Sep 24 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
Jan 27 Javascript
javaScript中的原型解析【推荐】
May 05 Javascript
js编写一个简单的产品放大效果代码
Jun 27 Javascript
js中的关联数组与普通数组详解
Jul 27 Javascript
新入门node.js必须要知道的概念(必看篇)
Aug 10 Javascript
简单谈谈ES6的六个小特性
Nov 18 Javascript
vue使用Font Awesome的方法步骤
Feb 26 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
Apr 26 Javascript
vue实现点击出现操作弹出框的示例
Nov 05 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
利用 window_onload 实现select默认选择
2006/10/09 PHP
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
php常用表单验证类用法实例
2015/06/18 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
Python实现端口复用实例代码
2014/07/03 Python
Python自动登录126邮箱的方法
2015/07/10 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
Python 支付整合开发包的实现
2019/01/23 Python
Python shelve模块实现解析
2019/08/28 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
个人简历的自荐信
2013/10/23 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技