class之super

51次阅读

共计 1085 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 0