构造函数模式下的自执行函数

Self Executing Function in Constructor Pattern

本文关键字:执行 函数 模式 构造函数      更新时间:2023-09-26

我最近遇到了以下模式:

/* 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的原型方法不是?这纯粹是为了更清晰地分离业务逻辑的一种风格方法吗?

完全没有区别。内部IIFE是完全没有意义的,因为它没有任何局部变量,可以安全地省略。唯一(一点)不同的是,外部IIFE中的Stuff现在是一个函数声明,而不是一个赋值给变量的函数。

当然,就其现状而言,外部的IEFE也相当无用,除了可能用于代码组织。

这两种模式都允许您轻松地创建附加到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的范围内,但它对外部世界是不可见的。您也可以在第二种模式中这样做,但是如果您在同一个文件中创建多个类,每个类都有自己的私有变量,那么第一种模式可能是有意义的。