2012-03-12 3 views
10

Я пытаюсь реализовать шаблон раскрывающегося модуля, но я не могу открыть измененную частную собственность.Выводить частные переменные в раскрывающемся шаблоне модуля

var myRevealingModule = (function(){ 

    var name = 'Diogo'; 

    function setName() { 
     name = name + ' Cardoso'; 
    } 

    return { 
     fullName: name, 
     set: setName 
    }; 

}()); 

// Sample usage: 
myRevealingModule.set(); 
console.log(myRevealingModule.fullName); // "Diogo" instead of the excepted "Diogo Cardoso". 

ответ

20
return { 
    fullName: name, 
    set: setName 
}; 

Это использует значения из name и setName. Он не создает ссылку на переменную. Эффективно копируется name.

Вам необходимо создать соответствующий метод getName, чтобы воспользоваться преимуществами закрытия, чтобы вы могли сохранить ссылку на переменную.

13
var myRevealingModule = (function(){ 

    var name = 'Diogo'; 

    function setName() { 
     name = name + ' Cardoso'; 
    }; 

    function getName() { 
     return name; 
    }; 

    return { 
     fullName: name, 
     set: setName, 
     get: getName 
    }; 

}()); 

http://jsfiddle.net/yeXMx/

0

Если ваше значение является атрибутом в объекте или массиве, вы можете экспортировать объект или массив, а экспорт будет по ссылке, поэтому внешние пользователи будут видеть обновленные изменения. Это немного рискованно, так как общий шаблон экспортируемых переменных имеет скалярную/объектную копию/ссылочную дихотомию.

Смежные вопросы