本文实例讲述了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.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 群星《初声证明2324》[320K/MP3][41.39MB]
- S14全球总决赛T1战队怎么样 全球总决赛T1战队详细介绍
- S14全球总决赛GEN战队怎么样 全球总决赛GEN战队详细介绍
- 全球总决赛lck参赛队伍是哪些 全球总决赛lck所有队伍队员一览
- 《真三国无双起源》PC版21:9超宽屏展示:压迫力拉满
- 男子做兼职主播月入3毛 还被工作人员骂土鳖
- 国外网友吐槽《龙腾4》IGN9分:点进去就为看你胡扯
- 谢霆锋.2000-零距离【英皇娱乐】【WAV+CUE】
- 杨林.1987-纯白【综一唱片】【WAV+CUE】
- BEYOND.1997-惊喜【滚石】【WAV+CUE】
- R星发展史:十年磨一剑 GTA和大表哥的缔造者!(下)
- 凭一己之力创立狗界缅北,他的虐狗方式为何让网友都拍手叫好?
- 杉果双十一特惠开启,《冰汽时代2》《如龙8》新史低
- 陈佳《再见如初见》限量1:1母盘直刻[低速原抓WAV+CUE]
- 群星《2024好听新歌30》AI调整音效【WAV分轨】