Ответ 1
Вы передаете номер здесь:
return {
points: totalPoints,
addPoints: addPoints
};
Этот фрагмент кода ничем не отличается от:
return {
points: 100,
addPoints: addPoints
};
Вы передаете значение; не ссылка на totalPoints
(последнее невозможно в JavaScript). Поэтому, когда totalPoints
изменяется, значение в объекте не выполняется.
Используя функцию
Самый простой способ обойти это - использовать функцию, чтобы получить самый свежий результат (например, getPoints
, который у вас уже есть). Этот JSFiddle дает полный пример:
return {
points: function(x) { return totalPoints; }, // always up-to-date
addPoints: addPoints
};
Недостатком является то, что вызывающий абонент должен теперь запросить points
как вызов функции:
console.log(george.points());
Использование геттеров и сеттеров
Другое решение - использовать геттеры, которые позволят вам получить обновленное значение только с помощью george.totalPoints
, хотя получатели не поддерживаются (пока). Вы можете реализовать геттер следующим образом:
var obj = {};
obj.points = addPoints;
// add a "special" property to the object instead of normal notation
Object.defineProperty(obj, "totalPoints", {
get: function() { // function that executed when you use `.totalPoints`
return totalPoints;
}
});
return obj;
Во-вторых, сброс var
делает глобальные функции правильными, но нецелесообразными. Вы можете сделать один оператор var
, используя запятые, если это то, что вы имеете в виду:
var totalPoints = 100, // expands to three `var` statements, so no
addPoints = ..., // global variables
getPoints = ...;