前言super
是什么?
也许很多人,如果没有面向对象开发经验,都不是很清楚。
包括我。
起因
之前在项目中使用class,没有用到继承,都是直接声明一个类,使用的时候,new
一个实例,很简单,但逻辑不是很清晰。
今天有一个想法,把基础功能抽离出来,做成基类,业务逻辑继承基础功能。这样有两个好处,一个就是基础功能可以做成多个项目通用,另一个就是便于业务拆分。其实说到底,就是解耦。
经过
之前有多个功能,都写在box类,项目入口就在box。
如今从box抽出了一个基类lib,一个业务入口business,还有很多细分的业务模块business-xx。
项目入口改为business,business继承lib,引入business-xx,实例化business-xx。
代码如下:
import Rail from './rail'
class Business extends Lib {
constructor(){
this.rail = new Rail(this)
}
}
但是很遗憾,报错:this hasn't been initialised - super() hasn't been called
这是说我没有执行super?
搜了一下,原来这是调用父类的构造方法,加了一行代码:
super()
然后还是报错,不过这次不是语法报错,是代码赋值错误,因为在父类的构造方法中,需要参数。
思考了一下,在super
中传递了几个参数,父类的构造函数控制台打印,果然就是super
中的参数。
很显然,super确实是调用父类的构造方法,而且可以传递参数。
结果
代码如下:
import Rail from './rail'
class Business extends Lib {
constructor(control){
super(control)
this.rail = new Rail(this)
}
}
这样,只要在项目的开始,实例化Business
,就可以把对应的功能注册进来,比如rail
。
而且后面如果需要添加功能,只需要如rail
一样,注册一次就行。
因为Business
继承自Lib
,又把Business
传递到了业务模块内部,所以在业务模块内部完全可以获取到Lib
的方法和属性。control
是整个大模块Business
和外部模块通信的桥梁。
结语
曾经想过,每一个业务子模块,比如rail
,直接继承自Lib
,然后也是在Business
中实例化。这样会不会更合适呢?
但是后来否决了这种想法,毕竟不同子业务模块之间也存在通信的需求,如果做得太过独立,通信也很麻烦。
不如全部子模块都挂载在Business
中,通信方便。
模块化,也有一定的界限吧。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。