用私有变量创建单例的方法

Ways to create a singleton with private variables?

本文关键字:单例 方法 创建 变量      更新时间:2023-09-26

我试图创建一个单例,有变量不直接从外部可变。这是我当前的代码:

var singleton = new (function () {
    var asd = 1;
    this.__defineGetter__("Asd", function() {
        return asd;
    });
})();
alert(singleton.Asd) // test

然而,似乎有很多丑陋的代码只是为了实现一个简单的事情。

私有变量创建单例有什么更简洁的替代方法吗?
var theStaticClass = (function () {
    var a = 7;
    return { get A() { return a; } };
})();
console.log(theStaticClass.A);

这是另一种(我不会说不难看)方式,但现在TheStaticClass.A更像是一个getter方法(优点是它也可以在IE中工作):

var TheStaticClass = new (function() {
  var a=1;
  arguments.callee.prototype.A = function() {
    return a;
  };
})();
alert(TheStaticClass.A()) //=> 1

假设您需要在返回之前对变量做一些修改:

var theStaticClass = (function () {
    var a = 7;
    return {A: (function(b){
        return b * b;
    })(a)};
})();
console.log(theStaticClass.A); // => 49

我认为只有闭包才能给JavaScript带来真正的私有变量。通常我们使用某种命名约定来判断变量是否是私有的。

var TheStaticClass;
(function () {
  var a=1;
  TheStaticClass.__defineGetter__("A", function() {
    return a;
  });
})();
alert(TheStaticClass.A) // test