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 相关文章推荐
基于JQUERY的两个ListBox子项互相调整的实现代码
May 07 Javascript
Knockoutjs快速入门(经典)
Dec 24 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
requireJS使用指南
Apr 27 Javascript
JavaScript函数节流概念与用法实例详解
Jun 20 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
Sep 21 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
Aug 24 Javascript
详解Node全局变量global模块
Sep 28 Javascript
JavaScript自执行函数和jQuery扩展方法详解
Oct 27 jQuery
vue的for循环使用方法
Feb 12 Javascript
微信小程序HTTP接口请求封装的实现
Feb 21 Javascript
Javascript 解构赋值详情
Nov 17 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
聊天室php&mysql(二)
2006/10/09 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
react 生命周期实例分析
2020/05/18 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
Python易忽视知识点小结
2015/05/25 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
Python操作MySQL数据库的方法
2018/06/20 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
工厂厂长的职责
2013/12/12 职场文书
企业授权委托书范本
2014/04/02 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
出差报告怎么写
2014/11/06 职场文书
大学军训通讯稿
2015/07/18 职场文书
教师岗位说明书
2015/09/30 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
DE1107机评
2022/04/05 无线电
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript