Установка и получение приватной переменной в шаблоне модуля - PullRequest
0 голосов
/ 05 марта 2012

Может кто-нибудь объяснить, почему закрытая переменная _a не обновляется с помощью установщика? Я, должно быть, упускаю что-то действительно очевидное, но не вижу этого.

var f = function(a){
   var _a = a;

   return {
       getA : _a,
       setA : function(e){
          _a = e;
       }
   }        
};    

var d = f(1);
console.log(d.getA); // 1

d.setA(2);
console.log(d.getA); // 1

Я думал, что второй вызов должен вернуть 2

код здесь - http://jsfiddle.net/JUKWN/

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

Для второго вызова сработает следующее:

var f = function(a){
   var _a = a;

   return {
       getA : function() {
           return(_a);
       },
       setA : function(e){
          _a = e;
       }
   }        
}; 

Ваш код помещает статическое представление значения _a в структуру данных, которую он возвращает, а не динамически получает свое значениеиз фактического источника.Вам нужна функция получения, чтобы динамически получить ее значение для всех типов данных.То, что у вас было бы, на самом деле работало бы, если бы _a содержало массив или объект (потому что они всегда по ссылке), но не тогда, когда это простой тип, такой как число или строка (который не является ссылкой).

Код, который я предложил, будет работать для всех значений _a.

1 голос
/ 05 марта 2012

У вас нет настоящей getter функции. Вы просто присваиваете значение _a свойству литерала возвращаемого объекта. Измените свой код следующим образом

return {
   getA : function() {
       return(_a);
   },
   setA : function(e){
      _a = e;
   }
};     

var d = f(1);
console.log(d.getA()); // 1

d.setA(2);
console.log(d.getA()); // 2

JSFiddle

...