Вы передаете номер здесь:
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's 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 = ...;