前言
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中,通信方便。
模块化,也有一定的界限吧。


陈其文
430 声望19 粉丝

前端