Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 显示模式用例_Javascript_Design Patterns_Factory_Revealing Module Pattern - Fatal编程技术网

Javascript 显示模式用例

Javascript 显示模式用例,javascript,design-patterns,factory,revealing-module-pattern,Javascript,Design Patterns,Factory,Revealing Module Pattern,我正在读Addy Osmani写的《学习javascript设计模式》一书。这本书很棒 这里有一个使用显示设计模式的示例: var myRevealingModule = (function () { var privateVar = "Ben Cherry", publicVar = "Hey there!"; function privateFunction() { console.log( "Name:" + privateVar );

我正在读Addy Osmani写的《学习javascript设计模式》一书。这本书很棒

这里有一个使用显示设计模式的示例:

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" );
现在,我当然理解了它是如何工作的,但我的问题更简单——在常规的、经典的节点webapp中使用它的用例是什么

假设我有一个汽车模块,我希望在我的一些程序中创建它。我看不出在这种情况下如何使用该模式。如何传递参数以生成新车(args)


我应该为单身人士使用这种模式吗?创建工厂?

JavaScript是一种有点奇怪的语言,如果不遵循最佳实践,或者不熟悉ECMA标准,有时会做一些奇怪的事情。JavaScript语法中有很多奇怪的东西,其中之一就是自执行(自调用)函数

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

 http://blog.mgechev.com/2012/08/29/self-invoking-functions-in-javascript-or-immediately-invoked-function-expression/
您可以像这样传递参数:

https://jsfiddle.net/6bhn80oz/

此模式用于封装某些私有状态,同时公开(“揭示”)公共接口

该模式可能有许多用例,但在其核心中,它展示了如何将实现(私有变量)与API(公开函数)分离,这在javascript中是不容易实现的

当你有一个有状态的模块时,最好使用它

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

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

我经常在angular 1中创建服务时使用它。对我来说,更容易知道我可以在服务中访问哪些方法和/或变量,并将
return{}
private之外的所有内容保持为私有

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

这是工厂模式的一个例子。这是一个合理的用法,我知道。问题是我还有什么其他用例可以使用暴露模块。我认为这个名称是误导性的,因为它实际上适用于函数和模块,如果您返回了一个函数,而不是一个对象文本,那么您现在有一个函数可以在调用之间具有内部状态(这是另一个用例)调用之间具有不同状态的函数。听起来很可怕——我不得不承认。函数应该是一个函数,我想就是这样。奇怪的是,将函数视为有状态对象,而不仅仅是异步操作的回调。我想对工厂使用这种模式是最好的用例。@Chen有一些非常有效的用例,比如函数