开辟日历控件的时刻,对方变动了一下需求,基础大将终究产物分红两个:
挑选一连时候段
挑选多个不一连时候
那末我们晓得,关于这类大部分功用一致,只要多少函数逻辑差别的产物,最合适的就是状态形式。因而很天然的,我就拿“2”作为规范形式,“1”作为新形式,将其重组成父类和子类,也许关联以下:
// 父类
// DatePicker.js
import RangeDatePicker from './RangeDatePicker';
class DatePicker {
....
static getInstance(el, options) {
if (options.scattered) {
return new DatePicker(el, options);
} else {
return new RangeDatePicker(el, options);
}
}
// 子类
// RangeDatePicker.js
import DatePicker from './DatePicker';
class RangeDatePicker extends DatePicker {
}
由于这个类只要两个成员,所以我把工场要领 .getInstance()
放到了父类内里,经由过程推断参数肯定应当返回哪一类实例。代码写完,测试的时刻却报错:
Super expression must either be null or a function, not undefined
这个意义很明显,被继续的父类不能未定义。但是 DatePicker
明显是定义了的,只是考证两个类文件的话,均未涌现任何语法毛病。
遇事不决先 Google,还真找到许多效果,不过大多数都和 React.Component 有关,翻了半天一无所得,只好自食其力。翻开 Chrome 开辟者东西,勾上“Pause on Exceptions”,视察发作非常时的状态,一遍又一遍,我逐渐意想到,发作这个毛病的时刻,DatePicker
还未能在 webpack 的环境中完成注册。题目找到了!
与别的编译类言语差别,JS 是动态言语,一切 JS 代码都是放到一致的环境里跑的,类的代码云云,import
也是云云。所以关于其他言语,比方 ActionScript、Java,轮回援用,即 A 援用 B,B 也援用 A,是没题目的,由于类的代码都邑编译到实行文件,实行的时刻,都已经在环境中;而 JS 是边实行边置入环境,详细到我这里,在将父类 DatePicker
放入环境时,会先 import
子类 RangeDatePicker
的代码,而子类又会请求 import
父类的代码,父类的代码正在引入中,因而便产生了题目。
想邃晓这点,背面就好办了,直接建立一个工场类,把工场要领放到内里实行,题目便处理了:
import DatePicker from './DatePicker';
import RangeDatePicker from './RangeDatePicker';
export default {
createDatePicker(el, options) {
if (options.scattered) {
return new DatePicker(el, options);
} else {
return new RangeDatePicker(el, options);
}
}
}
PS:昔时写依靠注入和包管理东西的时刻,就卡在这个处所,怎样都想不通,因而一向也没写完。没想到这些个浓眉大眼有头发的,也都这么不负责任,这类题目都不处理就搞出来让全世界人用了。
也见我的博客,双方同步更新。