我有一组相互协作的类(使用javascript编码)。
其中有一个父类和多个子类,由父类实例化。我有许多客户端需要向父或子类添加一个或多个方法。
为了避免每个客户端都继承这些类,因为子类的存在使得继承变得麻烦,我让这些客户端在实例化主类时将函数传递给父类。
主类会动态地创建方法,客户端可以像一直存在一样调用这些方法。
我的问题是:
- 这么做明智吗?
- 我正在做什么设计模式?
我有一组相互协作的类(使用javascript编码)。
其中有一个父类和多个子类,由父类实例化。我有许多客户端需要向父或子类添加一个或多个方法。
为了避免每个客户端都继承这些类,因为子类的存在使得继承变得麻烦,我让这些客户端在实例化主类时将函数传递给父类。
主类会动态地创建方法,客户端可以像一直存在一样调用这些方法。
我的问题是:
我必须承认模式并不是我的“强项”,但在JavaScript中你可以做任何你想做的事情。这就是所有框架实现这种“扩展”子“类”的方式(JavaScript 中没有类)。
如果你处于纯 JavaScript 的世界,你需要使用:
foo.prototype.bar = function() {};
foo
上调用bar
,并且bar
仅存在于内存中一次 - 也就是说,同一个函数通过每个foo
对象在内存中引用。因此,请注意您可能在该范围之外引用的任何变量。相反,您将提供一个接受函数作为其值的成员。
例如:
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.'
你应该提供一些代码,这样我们才能更好地了解你在谈论什么。
由于你没有提供代码,我只能猜测你没有使用原型。原型是“面向对象”JavaScript的“正确”设计模式。
当你将一个函数/属性/任何东西添加到JavaScript对象的原型中时,所有实例,新的和旧的都会在它们的原型上接收到该函数/属性/任何东西。
在JavaScript中扩展原型非常简单,不应该变得混乱。如果出现混乱,那可能意味着你过于复杂化了它。