【问题标题】:What is the advantage of this javascript module pattern? [closed]这种 javascript 模块模式的优势是什么? [关闭]
【发布时间】:2014-04-11 09:36:00
【问题描述】:

所以我一直在编写一个主干应用程序,我的模块通常是这样的结构:

var AppName = AppName || {};

AppName.Module = {};

AppName.Module.View = Backbone.View.extend({...});
AppName.Module.Model = Backbone.Model.extend({...});

但我最近偶然发现了这种模块模式:

var AppName = AppName || {};

AppName.Module = (function() {
    var View = Backbone.View.extend({...});
    var Model = Backbone.Model.extend({...});

    return {
        View: View,
        Model: Model
    }
})();

在第二种模式中,您可以定义只能从模块范围访问的“私有”方法,但除此之外,在我看来,它通常是一种更难测试的模式。有人可以向我解释为什么一些 javascript 程序员喜欢第二种方法作为一种天生更好的模式吗?

【问题讨论】:

  • “为什么第二种方法本质上是更好的模式?” 看起来你已经下定决心了,你也提供了这个观点的理由。
  • 我的意思是我已经看到有关此的博客文章将其描述为更好的模式,但我不明白为什么。为了清楚起见,我编辑了帖子
  • 嗯,是的,因为能够使用“私有”局部变量。

标签: javascript design-patterns backbone.js


【解决方案1】:

这是因为您可以使用私有变量。例如,我们可以使用模式定义bob并强制代码使用setName函数来更改他的名字(即不能通过直接访问来更改值:

var bob = (function(){
  var name = "Bob";

  return {
    setName: function(newName){
      name = newName;
    },
    getName: function(){
      return name;
    }
  }
}());

console.log(bob.getName()); // "Bob"
console.log(bob.name); // undefined
bob.setName("Bobby");
console.log(bob.getName()); // "Bobby"

通过立即执行函数定义,您可以获得一个新的作用域,您可以使用闭包来“隐藏”内部变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 2014-05-11
    • 2016-06-18
    • 2013-05-15
    • 1970-01-01
    • 2013-03-24
    • 2012-10-05
    • 2010-10-07
    相关资源
    最近更新 更多