Способы создания синглтона с закрытыми переменными? - PullRequest
1 голос
/ 20 апреля 2011

Я пытаюсь создать синглтон, в котором есть переменные, не изменяемые напрямую извне.Это мой текущий код:

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

alert(singleton.Asd) // test

Тем не менее, кажется, что очень много уродливого кода просто для достижения простой вещи.

Какие есть более чистые альтернативы для создания синглтона с такими приватными переменными?

Ответы [ 4 ]

3 голосов
/ 20 апреля 2011
var theStaticClass = (function () {
    var a = 7;
    return { get A() { return a; } };
})();

console.log(theStaticClass.A);
2 голосов
/ 21 апреля 2011

Предположим, вам нужно внести некоторые изменения в переменную перед возвратом:

var theStaticClass = (function () {
    var a = 7;
    return {A: (function(b){
        return b * b;
    })(a)};
})();
console.log(theStaticClass.A); // => 49
2 голосов
/ 20 апреля 2011

Это еще один (я бы сказал, менее уродливый) способ, но теперь TheStaticClass.A больше похож на метод получения (преимущество в том, что он также работает в IE):

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

alert(TheStaticClass.A()) //=> 1
1 голос
/ 20 апреля 2011

Я думаю, что только замыкание может привести к реальной закрытой переменной в JavaScript.Обычно мы используем какое-то соглашение об именах, чтобы определить, является ли переменная закрытой.

var TheStaticClass;

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

alert(TheStaticClass.A) // test
...