2015-01-09 7 views
0
function stapler() { 

    var color = "black"; 

    function setColor(newColor) { 
     console.log(color); //2. - black 
     color = newColor; 
     console.log(color); //3. - brown 
    } 

    function displayColor() { 
     console.log(color); 
    } 

    return { 
     c: color, 

     set: setColor, 

     display: displayColor 
    } 
} 

thing = stapler(); 

console.log(thing.c); //1. - black 
thing.set('brown'); 
console.log(thing.c); //4. - black, why doesn't this print brown? 

Как вы можете видеть из вышеперечисленного, вещь.c (последняя строка) возвращается черным, но почему не коричневый? Почему изменения не сохраняются? Что мне не хватает?Выявление шаблона модуля не устанавливает мою приватную переменную, почему?

EDIT:

См http://repl.it/7gs для рабочей копии кода ниже.

function stapler() { 

    var color = "black"; 

    function setColor(newColor) { 
     console.log(color); //2. - black 
     color = newColor; 
     console.log(color); //3. - brown 
    } 

    function getColor() { 
     return color; 
    } 

    return { 
     get: getColor(), 

     set: setColor, 
    } 

} 

thing = stapler(); 

console.log(thing.get); //1. - black 
thing.set('brown'); 
console.log(thing.get); //4. - black, why isn't this brown? 

И, наконец, действительно усложнить это ... проверить следующий пример -

(для просмотра на http://replit.com/7hD)

function stapler() { 

    var color = "black"; 

    function setColor(newColor) { 
     console.log(color); //2. - black, 6. - brown, why now has it changed? 
     color = newColor; 
     console.log(color); //3. - brown, 7. - purple 
    } 

    function getColor() { 
     return color; 
    } 

    return { 
     get: getColor(), 

     set2: function(newColor) { 
      setColor(newColor); 
     }, 

     set: setColor, 
    } 

} 

thing = stapler(); 

console.log(thing.get); //1. - black 
thing.set('brown'); 
console.log(thing.get); //4. - black, why isn't this brown? 
console.log(thing.get); //5. - black, why isn't this brown 

console.log('-----'); 

thing.set2('purple'); 
console.log(thing.get); //8. - black 

Что здесь происходит?

+0

Вы назначаете 'c' только один раз и не используете аксессор. –

ответ

3

Вам нужно добавить геттер - return {c:color/*...*/ помещает копию цвета в эту переменную в первый раз, но она напрямую не связана с памятью. Любые изменения в частной color переменной не связана с c элемента (который на самом деле хорошо - если он работал таким образом, вы могли бы изменить цвет снаружи с thing.c='magenta';) Вместо этого нужно:

function getColor() {return color; } 
/*...*/ 
return { get: getColor, set: setColor, display: displayColor }; 
+0

Я изменил его за ваш совет, и он все еще не работает. См. Обновленный пример в http://repl.it/7gs. –

+0

. Вы не должны иметь скобки на 'return {get: getColor' (добавив скобки, которые вы просите JS выполнить функцию и установить' get' в результат - не указывать на функцию) – Rudu

+0

Можно ли вызвать get без скобок? Рассматривать его скорее как атрибут? –

0

Измените две строки ваш код до

function stapler() { 

    var color = "black"; 

    function setColor(newColor) { 
    console.log(color); //2. - black 
    // color = newColor; CHANGE TO 
    this.color = newColor; 
    console.log(color); //3. - brown 
    } 

    function displayColor() { 
    //console.log(color); CHANGE TO 
    console.log(this.color); 
    } 

    return { 
    c: color, 

    set: setColor, 

    display: displayColor 
    } 
} 

и все будет в порядке.

Теперь, конечно, это уже не шаблон раскрывающегося модуля, потому что вы используете «это», но the Revealing Module Pattern is an anti-pattern в любом случае, ИМХО.