ES6 抽象类示例 以及输入输出类型限制

以下代码主要是实现一个es6抽象类示例,其中包括了AOP切面编程,以及输入输出类型限制。根据该实例,可以很快实现一组策略。
若有更好的方法,请在下方留言(需kx上网)讨论,谢谢。

// 输出类型
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()
展示评论