javascript - 通过自动发现功能向基类“注册”额外方法

标签 javascript node.js ecmascript-6

我正在开发一个基类,它将检查一组常用方法,并在每个方法存在时对其执行一些操作:

class BaseClass {

  get router() {
    if (!this._router) {
      this._register();
    }
    return this._router;
  }

  _register() {
    this._router = new Router()
    if (this.list) {
      this._router.use('/', this.list);
    }      

    if (this.detail) {
      this._router.use('/:id', this.detail);
    }
    // etc...

   }

}

我想允许该类的用户也“注册”他们自己的自定义方法。 作为第一遍,我想让它们覆盖 _register:

class MyClass extends BaseClass {      
  list() {...}

  _register() {
    super._register();
    this._router.use('/custom/route', this.customMethod);
  } 
}

嗯...这不太好,因为他们必须添加 super 样板并了解 _router

我的下一个最佳方案是添加一个方法来在基类中注册额外内容:

addExtraRoute(route, method) {
  this._extras[route] = method
}

然后在 _register 方法中循环它,将它们全部添加。 这稍微好一些,因为用户可以在构造函数中“注册”他们的方法:

class MyClass extends BaseClass {
    constructor() {
      super();
      this.addExtraRoute('/custom/route', this.customMethod);
    }
}

仍然不太好:

  • 定义方法和注册之间没有局部性,这有点难以阅读
  • 仍然是 super 样板,需要确保我们知道要传递给基类的任何参数。

什么是更好的设计?

最佳答案

设计某些类层次结构时有一个常见的模式,称为“扩展设计”。因此,通常我们会创建一些空(占位符)方法,这些方法将由客户端覆盖,并在生命周期内的某个位置执行这些方法。考虑以下因素:

class BaseClass {
 constructor() {
    _register(this.getExtraRoutes());
  }

  _register(routes) {
    ...
  }

  getExtraRoutes() {
    return [];
  }
}

class MyClass extends BaseClass {
  getExtraRoutes() {
    return { ... }
  }
}

这是您正在寻找的东西吗?

关于javascript - 通过自动发现功能向基类“注册”额外方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48829521/

相关文章:

node.js - 未勾选时无法读取复选框

javascript - 引用错误 : TextEncoder is not defined when importing jsdom library

javascript - 什么是 ...!! ES6 中的语法?

javascript - 在 Node-RED 中哪里可以找到控制台

open-source - FancyBox 2 的轻量级、移动兼容、现代、免费的替代品

javascript - 如何在nodejs中使用express get route从url中提取页面名称和authToken?

javascript - 如何计算可迭代对象的笛卡尔积

javascript - ES6 for-of 循​​环中的多重定义

javascript - 无法读取 null 的属性 'innerHTML'

javascript - 为什么在此代码中 d 被 @ 替换