美文网首页
ES6 抽象类示例 以及输入输出类型限制

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

作者: 章文顺 | 来源:发表于2019-10-21 11:25 被阅读0次

    以下代码主要是实现一个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
    搜罗各种前后端奇淫技巧,花式编程思想,日日更新,速来围观吧...

    相关文章

      网友评论

          本文标题:ES6 抽象类示例 以及输入输出类型限制

          本文链接:https://www.haomeiwen.com/subject/agttvctx.html