Javascript setter возвращает значение без проверки
Установщик JavaScript обновляет внутреннее значение по ссылке, но возвращаемое значение неверно.
var Game =
{
get points() {
return this._points;
},
set points(x){
x = Math.min(x,25);
this._points = x;
return this._points;
}
};
Game.points = 10 ;
console.log(Game.points); // outputs 10
var updatedPoints = (Game.points = 60);
console.log(updatedPoints); // outputs 60
console.log(Game.points); // outputs 25
Ожидаемое значение для 'updatedPoints' было 25!
Есть идеи, почему это может происходить? Можете ли вы предложить, если есть способ это исправить?
Причина, по которой нужно это исправить: чтобы убедиться, что код JS работает должным образом, необходимо поддерживать!
1 ответ
Простое назначение JavaScript (=
) возвращает правильное значение согласно спецификации ( 11.13.1). Это поведение игнорирует все проверки, которые происходят в вашем установщике.
Из спецификации:
Производство AssignmentExpression: LeftHandSideExpression = AssignmentExpression оценивается следующим образом:
- Пусть lref будет результатом вычисления LeftHandSideExpression.
- Пусть rref будет результатом вычисления AssignmentExpression.
- Пусть rval будет GetValue (rref).
- Бросьте исключение SyntaxError, если выполняются все следующие условия:
- Тип (lref) является Ссылка верна
- IsStrictReference (lref) является истинным
- Тип (GetBase (lref)) является записью среды
- GetReferencedName (lref) является либо "eval", либо "arguments"
- Вызовите PutValue (lref, rval).
- Вернуть рвал.
Таким образом, нет способа "исправить" вашу проблему, как это было задумано. проверка Game.points
должно быть достаточно.