2012-02-25 90 views
-1

有人可以向我解释下面的JavaScript设计模式示例以及它试图完成什么?JavaScript设计模式

var Knockback = { }; 
    Knockback.Observables = (function() { 

     function Observables(model, mappings_info, view_model) { 
      this.model = model; 
      this.mappings_info = mappings_info; 
      this.view_model = view_model; 


      //logic in here 
     } 
     Observables.prototype.destroy = function() { 
      //logic in here 


      this.view_model = null; 
      this.mappings_info = null; 
      return this.model = null; 
     }; 

     return Observables; 
    })(); 

Knockback.observables = function(model, mappings_info, view_model, options) { 
    return new Knockback.Observables(model, mappings_info, view_model, options); 
}; 
+1

你可能会喜欢:HTTP:尽管我无法说出你在这里看到的内容。 – Treffynnon 2012-02-25 12:51:23

回答

4

Knockback是一个命名空间。值存储在Knockback内部,因此它们不会与任何全局变量冲突。

Observables是坐在Knockback内部的构造函数。所有的逻辑是模块化

observales封闭((function() {})())用作返回的Observables实例的方法中,这是一种方式,人们可以使用什么作为“范围安全构造”之称。在JavaScript中,如果你调用一个没有新建的构造函数,那么这个对象默认为window,再次污染你的全局命名空间。

我不知道你对javascript有多了解,但我希望这有助于。

-------------------------------- updated ------------- -

1)闭包的功能与没有闭包相同,这是正确的(在我回答的时候,我不知道没有“私人”变量)。但是这种模式也允许你把这个构造函数放在任何你喜欢的地方。想象一下,如果名称空间(Knockback)名称更改为KB。您可以将构造函数放在那里,甚至不需要在闭包中更改一行代码。

2)Knockback.observer函数可能是一个膨胀(我个人不认为它是这样),但是“范围安全”因素被认为是最佳实践。考虑:

var standardCorrectInvokation = new Knockback.Observer('model', 'mappings_info', 'view_model'); 

var aboutToLooseMyJobInvokation = Knockback.Observer('this', 'is', 'un-intuative'); 
//goodbye global namespace 
alert(window.model); // this 
alert(window.mappings_info); // is 
alert(window.view_model); // un-intuative 
//goodbye job at reputable web firm 

我还想指出的是,男孩ES5营修复了这个问题,但严格的模式,并未在所有浏览器中实现,但(IE ..啊哈啊哈)

+2

实际上我没有看到那个自我调用的匿名函数/闭包。没有什么关闭。此外,“构造函数”调用看起来太臃肿和不必要。 – jAndy 2012-02-25 13:01:13

+0

@jAndy Ive为你更新了我的答案 – 2012-02-25 14:07:01