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 UI震动效果实现原理及步骤
Feb 04 Javascript
用Jquery重写windows.alert方法实现思路
Apr 03 Javascript
限制textbox或textarea输入字符长度的JS代码
Oct 16 Javascript
jquery实现用户信息修改验证输入方法汇总
Jul 18 Javascript
JS更改select内option属性的方法
Oct 14 Javascript
javascript使用 concat 方法对数组进行合并的方法
Sep 08 Javascript
javascript 操作cookies详解及实例
Feb 22 Javascript
jQuery事件_动力节点Java学院整理
Jul 05 jQuery
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 Javascript
react-native 圆弧拖动进度条实现的示例代码
Apr 12 Javascript
VUE v-model表单数据双向绑定完整示例
Jan 21 Javascript
JavaScript 判断数据类型的4种方法
Sep 11 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
PHP 使用MySQL管理Session的回调函数详解
2013/06/21 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
Python常见工厂函数用法示例
2018/03/21 Python
python实现扫描ip地址的小程序
2019/04/16 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
Jupyter加载文件的实现方法
2020/04/14 Python
Python如何读取、写入JSON数据
2020/07/28 Python
python批量修改文件名的示例
2020/09/27 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
CSS3属性box-shadow使用指南
2014/12/09 HTML / CSS
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
会计自我鉴定
2013/11/02 职场文书
大学生学习2014全国两会心得体会
2014/03/13 职场文书
商务助理求职信范文
2014/04/20 职场文书
机关作风建设自查报告
2014/10/22 职场文书
党支部四风整改方案
2014/10/25 职场文书
电工实训报告总结
2014/11/05 职场文书