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 相关文章推荐
Code:loadScript( )加载js的功能函数
Feb 02 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
Jan 03 Javascript
javascript实现回车键提交表单方法总结
Jan 10 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
Feb 25 Javascript
JS实现在页面随时自定义背景颜色的方法
Feb 27 Javascript
jQuery实现仿百度帖吧头部固定导航效果
Aug 07 Javascript
JS插件overlib用法实例详解
Dec 26 Javascript
理解javascript定时器中的单线程
Feb 23 Javascript
AngularJS教程之MVC体系结构详解
Aug 16 Javascript
H5实现仿flash效果的实现代码
Sep 29 Javascript
Vue入门之数据绑定(小结)
Jan 08 Javascript
js实现简单的秒表
Jan 16 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中使用curl入门教程
2015/07/02 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
jquery选择器使用详解
2014/04/08 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
Python 第一步 hello world
2009/09/25 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
python实现数据分析与建模
2019/07/11 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
python中使用np.delete()的实例方法
2021/02/01 Python
百联网上商城:i百联
2017/01/28 全球购物
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
毕业生在校学习的自我评价分享
2013/10/08 职场文书
十佳大学生村官事迹
2014/01/09 职场文书
会议开场欢迎词
2014/01/15 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
给医院的感谢信
2015/01/21 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书