以下代码主要是实现一个es6抽象类示例,其中包括了AOP切面编程,以及输入输出类型限制。根据该实例,可以很快实现一组策略。
若有更好的方法,请在下方留言讨论,谢谢。
// 输出类型
class Res {
constructor(isSuccess, msg) {
this.isSuccess = isSuccess
this.msg = msg
}
}
// 输入类型
class InputParams {
constructor(flag, data) {
this.flag = flag
this.data = data
}
}
// 抽象类
class MsgHandler {
constructor(params, callback) {
if (new.target === MsgHandler) {
// 抽象类不可以直接实例化
throw new Error('MsgHandler class can`t instantiate')
}
if (new.target !== MsgHandler) {
if (!new.target.prototype.hasOwnProperty('handler')) {
// 判断子实例是否重新handler方法
throw new Error('please overwrite handler method')
}
}
if (!(params instanceof InputParams)) {
// 限制构造函数第一个参数输入类型为InputParams
throw new Error('The type of the first parameter of the constructor is not InputParams')
}
this.params = params
this.callback = this.callbackProcess(callback)
}
handler() { }
// 回调函数前置切面(AOP编程思想)
callbackProcess(callback) {
if (typeof callback !== 'function') { return function () { } }
return function (...args) {
if (args.length === 0) {
args = [new Res(true, {})]
} else if (!(args[0] instanceof Res)) {
// 限制回调输出参数类型为Res类
throw new Error('arguments first parameters type is not Res')
}
return callback.apply(this, args)
}
}
}
// 继承抽象类
class ShowPopupHandler extends MsgHandler {
constructor(params, callback) {
super(params, callback)
}
// 重写抽象类方法
handler() {
console.log('handler showPopup')
console.log(this.params)
this.callback()
}
}
const m = new ShowPopupHandler(new InputParams('abc', { a: 1 }), function (res) {
console.log(res)
})
m.handler()
博客迁移新地址:点击前往
大前端知识库收集分享 www.190tech.site 壹玖零Tech
搜罗各种前后端奇淫技巧,花式编程思想,日日更新,速来围观吧...