单例声明的差异

Differences in singleton declarations

本文关键字:声明 单例      更新时间:2023-09-26

我很难理解以下单例声明的区别:

var Database = {
    hostname : "db1",
    opendatabase : function() {
        //some code here
    }
}

var Database = (function () {
    var hostname = "db1";
    return {
        opendatabase : function () {
            //some code here
        }
    }
}());

正如在注释中指出的那样,第二个代码示例无效。这是因为最外层的花括号。正确的做法是:

var Database = (function() {
    var hostname = "db1";
    return {
        opendatabase : function() {
            //some code here
        }
    };
})();

也就是说,两个代码示例之间有一个主要区别。在第一个示例中,hostname是对象的属性,这意味着以下代码将是有效代码:

console.log(Database.hostname); //outputs "db1"

在第二个示例中,hostname是一个私有变量,这意味着它不能在数据库构造函数之外访问:

console.log(Database.hostname); //outputs undefined

首先,一个小小的语法更正。第二个代码片段应该是

var Database = (function () {
    var hostname = "db1";
    return {
        opendatabase : function () {
            //some code here
        }
    }
}());

这两个singleton的区别在于,在第一个singleton中,每个人都可以用Database.hostname = 'I changed your stuff';更改hostname,而在第二个singleton中,只有Database的函数可以访问hostname,因为它是在匿名函数中声明的。