JS设计模式(二)-Revealing Module(揭示模式)

概念

在模块模式的基础上,在返回的私有范围内,重新定义所有的 函数和变量。并返回一个匿名的对象。他拥有所有指向私有函数的指针。

实例

var myRevealingModule = function(){
    var privateVar = "Ben ",
        publicVar = "hello word";

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

    function publicSetName (strName){
        privateName = strName
    }

    function publicGetName () {
        privateFunction();
    }

    return {
        setName : publicSetName,
        greeting  :privateVar,
        getName : publicGetName
    }
}();

myRevealingModule.setName('mps');

相当于在return的 时候不直接return 会私有属性和方法的名称 而是自己定义一套命名然后全部放在一个匿名函数里面 整体返回 使用的时候你只知道自己定义的名称,不可以使用私有的任何提示信息。

 

The Revealing Module Pattern(显示模块模式)

现在我们已经对模块模式有了更进一步的了解,让我们再来看一个轻微的改进版 - Christian Heilmann的显示模块模式。

显示模块的出现是由于Heilmann对于一个事实非常沮丧,当他从另一个方法调用一个公有方法或者访问公有变量时,必须要重复主对象的名称。而且使用Module时必须要切换到对象字面量表示法来让某种方法变成公有方法。

他努力的结果就是更新了模式,我们可以在私有的作用域内简单的定义所有的方法和变量,并且返回一个匿名的对象指向我们希望公开的私有方法。

案例如下:


var myRevealingModule = (function () {

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

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

        function publicSetName( strName ) {
            privateVar = strName;
        }

        function publicGetName() {
            privateFunction();
        }


        // 显示的公有对象指向私有的方法和属性

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

    })();

myRevealingModule.setName( "Paul Kinlan" );

如果我们愿意的话,这种模式也可以用一个更具体的方案来显示私有函数和属性。


var myRevealingModule = (function () {

        var privateCounter = 0;

        function privateFunction() {
            privateCounter++;
        }

        function publicFunction() {
            publicIncrement();
        }

        function publicIncrement() {
            privateFunction();
        }

        function publicGetCount(){
          return privateCounter;
        }

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

       return {
            start: publicFunction,
            increment: publicIncrement,
            count: publicGetCount
        };

    })();

myRevealingModule.start();

优点

这种模式可以让我们脚本的语法变得更加一致,它也让模块的结尾更加的清晰。我们的方法和变量可公开访问,从而简化可读性。

缺点

如果一个私有方法引用了一个公有的方法,如果补丁是必要的则公有方法是不可以被重写的。这是因为私有方法将继续引用私有的实现并且模式不应该应用于私有成员,只适用于私有函数。

引用私有变量的公有对象成员也服从上面的无补丁规则。

因此,用显示模块模式创建的模块,可能比用传统的模块模式创建的模块更脆弱,所以在使用过程中应多加小心。



作者:pws019
链接:https://www.jianshu.com/p/677148547f02
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(前端设计模式)