【问题标题】:Javascript: Module Pattern vs Constructor/Prototype pattern?Javascript:模块模式与构造函数/原型模式?
【发布时间】:2011-04-16 23:54:04
【问题描述】:

我想知道是模块模式还是构造器/原型模式更适用于我的工作。

基本上我使用的是不显眼的 javascript -- HTML 文档引用了 .js 文件。

我对模块模式的理解:

  • 调用一个 INIT 方法(它基本上是一个我可以使用模块模式创建和返回的公共方法)
  • 在 INIT 方法中,分配所有点击事件等。

这听起来像是适合我的情况的完美模式,因为我不需要创建对象和继承层次结构等。

我对构造函数/原型模式的理解:

  • 用于创建对象
  • 用于使用继承(即超类型的子类型)

我说得对吗,对于提供不显眼的 javascript,模块模式是理想的?

【问题讨论】:

    标签: javascript design-patterns unobtrusive-javascript module-pattern


    【解决方案1】:

    构造函数和原型是实现类和实例的合理方法之一。它们与该模型并不完全对应,因此您通常需要选择特定的方案或辅助方法来根据原型实现类。 (Some background on classes in JS.)

    模块模式通常用于命名空间,其中您将有一个实例作为存储来对相关函数和对象进行分组。这是一个不同于原型设计的用例。他们并没有真正相互竞争。你可以很高兴地同时使用两者(例如在模块中放置一个构造函数并说new MyNamespace.MyModule.MyClass(arguments))。

    【讨论】:

    • 所以在我的情况下,我真的不想创建实例,所以模块模式可能是我想要的理想选择。当您说命名空间时..我如何在模块模式中命名空间?我看到了一种使用 YUI 的方法——但这真的有必要吗?
    • 没有什么特别的技巧,你只需使用 JavaScript Object 作为查找。要么直接创建一个对象字面量,如var MyModule= { someProperty: 3, someFunction: function() { ... }, somethingElse: null };,要么分配给MyModule.someFunction= function() { ... };。如果你想要私有变量,你可以在一个立即调用的函数表达式中执行它,并将 return 一个对象放在一个闭包中......我个人认为“真正的”私有变量完全是浪费时间。
    • js 有类的想法可能会非常误导 - 这是一本关于该主题的优秀书籍You Don't Know JS | This & Object Prototypes - 尽管 ES6 支持“类”,但这些大多只是一个掩饰原型功能和将这些视为类(就像您认为 Java 或 C# 中的类一样)会导致您走上混乱的道路。在使用原型时,我建议使用上述链接书第 6 章中描述的 OOLO 模式。
    • 我还建议在 js 中继承的想法有点用词不当,委托是一个更好的术语:chipersoft.com/p/inheritance。我同意模块模式对于保持复杂的应用程序整齐分离很有用,但是有很多很好的案例可以使用模块模式进行组合/增强,特别是如果你正在与不太熟悉 js 的开发人员一起工作 - 这对他们来说可能更容易了解 IIFE 是什么与(真正)了解原型:adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html
    • @bobince 我知道你很久以前就发过这个了,但是为什么你觉得真正的私有变量是在浪费时间呢?
    【解决方案2】:

    模块模式比原型更容易和优雅。但是,首先考虑移动。这不是中/大型对象的相关模式,因为初始化需要在开始之前解析整个块。多个闭包还会创建垃圾收集器不会释放的循环依赖项(尤其是 IE),这会导致在关闭窗口(或选项卡)之前不会释放更重的内存占用 - 检查 chrome 任务管理器进行比较 - 加载时间与使用模块模式的对象大小成反比,而原型继承并非如此。 上述陈述通过多个基准测试验证,例如:http://jsperf.com/prototypal-performance/54

    如上次测试所示。小对象最好被初始化为普通对象(没有这些模式)。它适用于不需要闭包或继承的单个对象。明智的做法是评估您是否甚至需要这些模式。

    【讨论】:

      【解决方案3】:

      原型模式帮助我们扩展功能,无论对象数量多少,内存中只有一个函数实例。在模块模式中,每个对象在内存中创建一个新的函数实例,但它提供了私有/公共变量的概念,并有助于封装变量和函数。

      【讨论】:

      • Douglas crockfords 允许使用私有成员的特权类方法怎么样?
      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多