gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:53:28 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com