我是使用 JavaScript 的中等熟练程序员,但我不是大师。我知道你可以用它做一些非常强大的事情,除了相当基本的 DOM 操作之外,我还没有看到太多东西。我想知道人们是否可以提供一些使用 JavaScript 的传统设计模式概念的示例,例如工厂方法、单例等。在什么情况下这些模式会在网络上使用?
10 回答
我只是想添加我从 Jonathan Rauch 已经推荐的 Pro JavaScript Design Patterns 中学到的最喜欢的 JavaScript 模式。
它是命名空间单例模式。基本上,您通过单例创建名称空间,允许您隐藏外部使用的方法和变量。隐藏/公开的方法实际上是隐藏的,因为它们是在闭包中定义的。
var com = window.com || {};
com.mynamespace = com.mynamespace || {};
com.mynamespace.newpackage = (function() {
var myPrivateVariable = "hidden";
var myPublicVariable = "exposed";
function myPrivateMethod() {
return "also hidden";
}
function myPublicMethod() {
return "also exposed";
}
return {
myPublicMethod: myPublicMethod,
myPublicVariable: myPublicVariable
};
})();
Nickolay 谈到了这一点,但设计模式在具有巨大差异的语言之间并不一致。我以前读过(并且同意)设计模式通常是语言中缺少功能的标志。
作为一个完美的例子,“工厂”模式在某些语言中是完全不需要的,我正在考虑的例子是 Ruby(因为对象构造只是 Class 实例上的一个方法):
# create a factory for MyObject
my_factory = MyObject
instance_1 = my_factory.new
# change the factory to another class
my_factory = MyOtherObject
instance_2 = my_factory.new
每当您将设计模式应用于与最初开发时不同的语言时,请确保您考虑它是否真的有必要,以及您可以通过哪些方式使用可用的新语言特性来改进它。设计模式只是一个指南,您应该始终考虑您想要的用途是否真的需要该模式,或者是否可以在您的情况下以更好的方式采用它。
@jamting:
我的天啊。我无语了。
对 OP:是的,在某种意义上你当然可以,但有些模式,正如你所习惯的那样,不像 Java 那样可见。例如,单例只是一个对象:
var singleton = {
sayHello: function() {
alert("Hello!")
}
};
维基百科有一个JS中的Factory示例。
Addy Osmani有一本很好的免费在线书籍,介绍了 Javascript 设计模式:Essential JavaScript Design Patterns For Beginners, Volume 1
我最近使用了Bernie 的 Better Animation Class,它广泛使用了策略设计模式。伯尼很好地描述了为什么应该使用策略模式,但遗憾的是没有准确解释代码是如何工作的。再说一次,在使用设计模式参考时,请查看 animator.js 中的代码和注释,以了解如何使用策略模式的一个很好的示例。
例子:
// This object controls the progress of the animation
ex1 = new Animator();
// The Animator's subjects define its behaviour
ex1.addSubject(updateButton);
function updateButton(value) {
$('ex1Button').innerHTML = "Progress: " + Math.round(value * 100) + "%";
}
// now click below: each click to the button calls ex1.toggle()
这就是自调用设计模式。在我开始 Javascripting 之前,我从未见过它。
我怀疑他们可以——这里有一个 Singleton 的例子:
他们当然可以。这是一本关于该主题的书:
Pro JavaScript Design Patterns
这是工厂模式的一个示例:
Javascript中的工厂模式
我想在这里补充一下我作为一个小组研究过的内容,讨论了 C# 和 JavaScript 中的设计模式。会议期间对我来说最奇特的是 C# 人用 JavaScript 编写代码,而 JavaScript 人也是如此。离开会议后,我尝试在家中了解更多信息并在此处 为 C# 和 JavaScript写博客http://tech.wowkhmer.com/category/Design-Patterns.aspx 。
听Justin Diaz 谈论 Javascript 的设计模式。该演讲还基于他上面提到的《Pro Javascript Techniques》一书。Google I/O 上的演讲时间约为 45 分钟