我有一组一起工作的类(我用javascript编写代码)。
有一个父类和一些由父类实例化的子类。我有许多这些类的客户端,每个客户端都需要向父类或子类添加一个或多个方法。
我没有让每个客户端继承这些类,这些类是可行的但是由于子类而变得混乱,我让这些客户端在实例化主类时将函数传递给父类。
主类动态创建方法,客户端可以调用方法,就像它们一直在那里一样。
我的问题是:
答案 0 :(得分:3)
strategy pattern用于在运行时获得“策略”的情况。可能适用于此。在这种情况下,策略是一个符合行为的类,即具有“执行”或其他类似的方法。
decorator pattern也可能适用。它也是一个运行时模式,但是增加了它在方法级别进行装饰的类。
因此,如果您动态选择类,则策略模式是好的,如果您只是在运行时更改方法实现,则Decorator很好。
(我在ircmaxell的许可下接受了这个答案的装饰部分)
答案 1 :(得分:2)
我必须承认模式不是我的“东西” - 但你可以在javascript中完全按照自己的意愿行事。这就是所有框架如何实现“扩展”子类“类”的方式(javascript中没有类)。
如果您在纯JavaScript世界中,您想使用:
foo.prototype.bar = function() {};
所以你可以在任何bar
上调用foo
,而bar
只存在于内存中一次 - 也就是在每个foo
对象的内存中引用相同的函数。因此,请注意您可能在该范围之外引用的任何变量。
每个库都有自己的插件架构来实现大致相同的目标(并且它们会处理原型中的一些混乱/危险)
答案 2 :(得分:0)
您应该提供一些代码,以便我们能够了解您正在讨论的 。
你还没有:我只能猜测你是不使用原型。原型将是“面向对象”JavaScript的“正确”设计模式。
当你在JavaScript中为一个对象的原型添加一个函数/ property / whatever时,所有实例,new和old 都会在它们的原型上接收函数/ property /。
在JavaScript中扩展原型非常简单,永远不会变得混乱。如果是这样,那可能意味着你过度复杂了。
答案 3 :(得分:0)
正如 hvgotcodes 所说,你正在描述策略模式,就你的具体情况而言,不是使用原型(从而影响你班级的所有对象)。
相反,你会提供一个接受函数作为值的成员。
e.g。
function MyClass() {
this.myFunction = defaultFunction;
this.defaultFunction = function() {
// do something by default.
alert("using default");
}
this.doFunction = function() {
// something that calls myFunction.
this.myFunction();
}
}
---8< snip --------
// later on...
t = new MyClass();
t.doFunction(); // output 'using default'
t.myFunction = function(){
// do something specific with this instance, when myFunction is called.
alert("customized for this instance.");
}
t.doFunction(); // output 'customized for this instance.'