构造函数模式中的自执行功能

时间:2014-08-15 02:01:25

标签: javascript

我最近遇到了以下模式:

/* PATTERN 1 */
(function(window) {
    var Stuff = (function() {  // Variable assignment and self-invoking anonymous function
        function Stuff(params) {
            this.items = [];
        }
        Stuff.prototype = {
            someMethod1: function() {

            },
            someMethod2: function() {

            }
        };
        return Stuff;
    }());  // END Variable assignment

    Stuff.create = function(params) {
        return new Stuff(params);
    };

    window.Stuff = Stuff;
}(window));

让我感到困惑的是分配Stuff变量的角色。具体来说,这种模式如何在操作上与以下不同:

/* PATTERN 2 */
(function(window) {
        // No variable assignment or self-invoking anonymous function
        function Stuff(params) {
            this.items = [];
        }
        Stuff.prototype = {
            someMethod1: function() {

            },
            someMethod2: function() {

            }
        };

    Stuff.create = function(params) {
        return new Stuff(params);
    };

    window.Stuff = Stuff;
}(window));

模式1的原型方法的范围是否以某种方式私有,模式2的原型方法不是? 这纯粹是一种风格化的方法,可以更明确地分离业务逻辑吗?

2 个答案:

答案 0 :(得分:2)

完全没有区别。内部IIFE is totally pointless,因为它没有任何局部变量,可以安全地省略。唯一(小)差异是外部IIFE中的Stuff现在是function declaration, not a function assigned to a variable

当然,就目前情况而言,外部IEFE也是无用的,除了代码组织。

答案 1 :(得分:2)

这两种模式都允许您轻松创建附加到Stuff"类"的真正私有变量,但不能在其外部访问:

var Stuff = (function() {  // Variable assignment and self-invoking anonymous function
    var stuff_private = "stuff";

    function Stuff(params) {
        this.items = [];
    }
    Stuff.prototype = {
        someMethod1: function() {

        },
        someMethod2: function() {

        }
        getStuff: function() {
            return stuff_private;
        }
    };
    return Stuff;
}());  // END Variable assignment

stuff_private现已嵌入Stuff的范围内,但它对外界来说是不可见的。您也可以在第二个模式中执行此操作,但如果您在同一个文件中创建多个类,每个类都有自己的私有变量,那么第一个模式可能有意义。