JavaScript 单例模式 - 有哪些不同之处?

5
这可能是一个愚蠢的问题,但这两种模式之间是否有功能上的区别呢?没有实际功能差异,只是组织喜好的问题吗?您在什么情况下想使用其中之一而不是另一个?我正在尝试找到我感觉最舒适的设计模式。谢谢!
$(function(){
    Core.init();
});

var Core = {

    init: function() {
       //some initialization code here
    }

    _plugins: function() {
       //instantiate some plugins here
    }

    _display: function() {
       //some more code here
    }

    _otherfunctions: function() {
       ....
    }

}

并且

$(function(){
    Core.init();
    Plugins.init();
    Display.init();
});

var Core = {

    init: function() {
       //some initialization code here
    }
}

var Plugins = {
    init: function() {
       //start plugins
    }

    _modify: function() {
      //more code
   }
}

var Display = {
    init: function() {
     //some init code
    }
}
2个回答

1

主要组织上的区别是第一种模式对全局命名空间污染更少

如果你确实希望像第二个例子那样将代码分成包,那么更好的方式,在你的示例中,应该是:

$(function(){
    Core.init();
});

var Core = {

    init: function() {
       //some initialization code here
    },

    plugins: {
        init: function() {
        //start plugins
        }

        _modify: function() {
        //more code
        }
    },

    display: {
        init: function() {
        //some init code
        }
    }
}

并通过您的主命名空间引用包:

Core.plugins.init();

我并不是说这是一般情况下最好的做法(其中一些是关于偏好的问题,比如私有成员和方法),但在你的例子中- 我更喜欢我的。


1

看看我建立的这个框架。似乎运行得相当不错。

var gtg = gtg || {};

(function () {
    var _this = this;

    this.registerNamespace = function (namespace) {
        var root = window,
            parts = namespace.split("."),
            i;

        for (i = 0; i < parts.length; i++) {
            if (typeof root[parts[i]] === "undefined") {
                root[parts[i]] = {};
            }
            root = root[parts[i]];
        }

        return this;
    };

}).call(gtg);

// Register Namespaces
gtg.registerNamespace("gtg.core");
gtg.registerNamespace("gtg.infoBar");
gtg.registerNamespace("gtg.navBar");
gtg.registerNamespace("gtg.tabBar");
gtg.registerNamespace("gtg.utils");

(function () {
    var _this = this;

    this.initialize = function () { };

}).call(gtg.core);

(function () {
    var _this = this,
        $container,
        $messageContainer,
        $message;

    function configureMessage(message) {
        var className = "info",
            types = ["error", "info", "warning"];

        for (var i in types) {
            $message.removeClass(types[i]);
        }

        switch (message.MessageType) {
            case 0:
                className = "error"
                break;
            case 1:
                className = "info"
                break;
            case 2:
                className = "warning"
                break;
        }

        $message.addClass(className).html(message.Message);
    }

    this.initialize = function () {
        $container = $(".info-bar-container");
        $messageContainer = $container.find(".message-container");
        $message = $messageContainer.find(".message");

        $messageContainer.find(".close a").bind("click", function () {
            _this.close();
        });
    };

    this.close = function () {
        $messageContainer.fadeOut(300, function () {
            $container.slideUp(300);
        });
    };

    this.show = function (message) {
        if ($container.css("display") !== "none") {
            $messageContainer.fadeOut(300, function () {
                configureMessage(message);
                $messageContainer.fadeIn(300);
            });
        } else {
            $container.slideDown(300, function () {
                configureMessage(message);
                $messageContainer.fadeIn(300);
            });
        }
    };

}).call(gtg.infoBar);

(function () {
    var _this = this;

    function initializeNavBar() {
        var paths = window.location.pathname.split("/"),
            navId;

        $("#nav-bar ul.top-nav li a[data-nav]").bind("click", function () {
            _this.switchNav($(this));
        });

        if (paths[1] != "") {
            switch (paths[1]) {
                case "Customer":
                    navId = "customers-nav";
                    break;
                case "Order":
                    navId = "orders-nav";
                    break;
                case "Product":
                    navId = "products-nav";
                    break;
                case "Report":
                    navId = "reports-nav";
                    break;
                case "Tool":
                    navId = "tools-nav";
                    break;
            }

            if (navId != "") {
                _this.switchNav($('#nav-bar ul.top-nav li a[data-nav="' + navId + '"]'));
            }

        } else {
            _this.switchNav($('#nav-bar ul.top-nav li a[data-nav="home-nav"]'));
        }
    }

    this.initialize = function () {
        initializeNavBar();
    };

    this.switchNav = function (navItem) {
        $("#nav-bar ul.top-nav li a[data-nav]").each(function (i) {
            $(this).removeClass("selected");
            $("#" + $(this).data("nav")).hide();
        });

        navItem.addClass("selected");
        $("#" + navItem.data("nav")).show();
    };

}).call(gtg.navBar);

(function () {
    var _this = this;

    this.initialize = function () {
        $(".tab-bar ul li a[data-tab-panel]").bind("click", function () {
            _this.switchTab($(this));
        });
    };

    this.switchTab = function (tab) {
        $(".tab-bar ul li a[data-tab-panel]").each(function (i) {
            $(this).removeClass("selected");
            $("#" + $(this).data("tab-panel")).hide();
        });

        tab.addClass("selected");
        $("#" + tab.data("tab-panel")).show();
    };

}).call(gtg.tabBar);

(function () {
    var _this = this;

    this.focusField = function (fieldId) {
        $("#" + fieldId).select().focus();
    };

    this.loadJQTemplate = function (templateName, callback) {
        $.get("/Content/JQTemplates/" + templateName + ".html", function (template) {
            callback(template);
        });
    };

}).call(gtg.utils);

$(document).ready(function () {
    gtg.core.initialize();
    gtg.infoBar.initialize();
    gtg.navBar.initialize();
    gtg.tabBar.initialize();
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接