是否有将方法注入类的设计模式?

时间:2011-02-01 23:13:05

标签: javascript oop design-patterns

我有一组一起工作的类(我用javascript编写代码)。

有一个父类和一些由父类实例化的子类。我有许多这些类的客户端,每个客户端都需要向父类或子类添加一个或多个方法。

我没有让每个客户端继承这些类,这些类是可行的但是由于子类而变得混乱,我让这些客户端在实例化主类时将函数传递给父类。

主类动态创建方法,客户端可以调用方法,就像它们一直在那里一样。

我的问题是:

  1. 这是一件明智的事吗?
  2. 我正在做的设计模式是什么?

4 个答案:

答案 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.'