本文实例讲述了ES6 class类链式继承,实例化及react super(props)原理。分享给大家供大家参考,具体如下:class定义类是es6提供的新的api,比较直观,class类继承也有着一定的规律性,在egg, webpack等库的源码中有着很多的应用场景。结合一些初学者可能遇到的难点,本文主要对其链式继承进行总结,关于super关键字的使用请参考我的其他文章es6中super关键字的理解。es6中super关键字的理解class定义
class App {

constructor(options){

super() //报错

//console.log(options)

}
}

class AppChild extends App{

getConfig(){

console.log('获取config')

}
}

class App {

constructor(options){

super() //报错

//console.log(options)

}
}

class AppChild extends App{

getConfig(){

console.log('获取config')

}
}
class定义类时,constructor不是必须的,可以省略直接定义类时,不能再constructor中使用super()class 链式继承1,省略constructor: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'})

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'})

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关键字的理解es6中super关键字的理解加入super之后,最后顶层获取的options就被super修改了。这是为什么呢,通过调试可以发现,super()执行时,会去执行其所继承类的constructor,当父级类完成初始化之后,才会去执行super()之后的逻辑。简单的说,super()是父级类实例化的入口简单的说,super()是父级类实例化的入口3,模拟实现react中class类,super(props)之后,可以使用this.props3,模拟实现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'})

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./code/HtmlJsRun测试上述代码运行效果。在线HTML/CSS/JavaScript代码运行工具在线HTML/CSS/JavaScript代码运行工具http://tools./code/HtmlJsRun关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》javascript面向对象入门教程JavaScript错误与调试技巧总结JavaScript数据结构与算法技巧总结JavaScript遍历算法与技巧总结JavaScript数学运算用法总结希望本文所述对大家JavaScript程序设计有所帮助。