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 оценивается следующим образом:

  1. Пусть lref будет результатом вычисления LeftHandSideExpression.
  2. Пусть rref будет результатом вычисления AssignmentExpression.
  3. Пусть rval будет GetValue (rref).
  4. Бросьте исключение SyntaxError, если выполняются все следующие условия:
    • Тип (lref) является Ссылка верна
    • IsStrictReference (lref) является истинным
    • Тип (GetBase (lref)) является записью среды
    • GetReferencedName (lref) является либо "eval", либо "arguments"
  5. Вызовите PutValue (lref, rval).
  6. Вернуть рвал.

Таким образом, нет способа "исправить" вашу проблему, как это было задумано. проверка Game.points должно быть достаточно.

Другие вопросы по тегам