0

我正在阅读Addy Osmani的一本名为“Learning javascript design patterns”的书。这本书很棒。揭示模式用例

有使用揭示设计模式的一个例子:

var myRevealingModule = (function() { 

    var privateVar = "Ben Cherry", 
     publicVar = "Hey there!"; 

    function privateFunction() { 
     console.log("Name:" + privateVar); 
    } 

    function publicSetName(strName) { 
     privateVar = strName; 
    } 

    function publicGetName() { 
     privateFunction(); 
    } 


    // Reveal public pointers to 
    // private functions and properties 

    return { 
     setName: publicSetName, 
     greeting: publicVar, 
     getName: publicGetName 
    }; 

})(); 

myRevealingModule.setName("Paul Kinlan"); 

现在,我当然明白它是如何工作的,但我的simpler-什么用的情况下在有规律的,经典的节点使用这个问题Web应用程序?

比方说,我有一个汽车模块,我希望在某些程序中创建。我看不出在这种情况下如何使用模式。我如何传递参数以使new Car(args)

我应该将这种模式用于单身吗?创建工厂?

回答

1

该模式用于在暴露(“显示”)公共接口的同时封装一些私有状态。

这个模式可以有很多用例,但是它的核心是它展示了如何从API(暴露的函数)中分离实现(私有变量),这在javascript中是不平凡的。

无论何时只要有一个有状态的模块,最好使用它。

要提供参数,只需公开一个接受参数的API函数,例如

return { 
    createCar: function(model, mileage) { ... } 
} 
+0

好吧,这是工厂模式的一个例子。这是一个公平的使用,我知道它。问题是我使用揭示模块的其他用例。 – Chen

+0

我认为这个名字是误导性的,因为这实际上适用于函数以及模块,如果您不是返回一个函数的对象文字,而是您现在有一个函数可以在调用之间具有内部状态(这是另一个用例) – thedude

+0

函数具有不同调用之间的状态。听起来很可怕 - 我不得不承认。函数应该是一个函数,就是这样,IMO。奇怪的是把函数当作一个有状态的对象,而不仅仅是作为异步操作的回调。我想这种工厂模式是最好的用例。 – Chen

0

JavaScript是一种奇怪的语言,如果你不遵循最佳实践并且不熟悉ECMA标准,有时会做出奇怪的事情。有许多奇怪的事情在JavaScript语法,它们是自执行(自我呼叫)功能的一个...

更多的细节,你可以在这里阅读

http://blog.mgechev.com/2012/08/29/self-invoking-functions-in-javascript-or-immediately-invoked-function-expression/ 

您可以传递参数是这样:

https://jsfiddle.net/6bhn80oz/ 
0

我经常在创建服务时在角度1中使用它。对我而言,知道我可以在服务中访问哪些方法和/或变量并将其他所有内容保留在私有之外更容易。

angular.module('myModule') 
.factory('someService', function() { 
    function myFunction(){ 
    } 
    return{ 
     getSomething:myFunction 
    } 
});