Javascript setter返回值而不进行验证

Javascript setter返回值而不进行验证,javascript,getter-setter,javascript-objects,ecmascript-5,javascript-engine,Javascript,Getter Setter,Javascript Objects,Ecmascript 5,Javascript Engine,JavaScript setter更新引用处的内部值,但返回值不正确 var Game = { get points() { return this._points; }, set points(x){ x = Math.min(x,25); this._points = x; return this._points; } }; Game.points = 10 ; conso

JavaScript setter更新引用处的内部值,但返回值不正确

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代码按预期执行,可维护性

JavaScript简单赋值(
=
)根据规范()返回正确的值。此行为忽略在setter中发生的任何验证

根据规范:

生产分配表达式:LeftHandSideExpression= AssignmentExpression的计算如下:

  • 让lref作为计算LeftHandSideExpression的结果
  • 设rref为赋值表达式求值的结果
  • 设rval为GetValue(rref)
  • 如果以下条件均为真,则引发SyntaxError异常:
    • 类型(lref)为参考值true
    • ISTRICTREFENCE(lref)为
    • 类型(GetBase(lref))是环境记录
    • GetReferenceName(lref)是“eval”或“参数
  • 调用PutValue(lref,rval)
  • 返回rval

  • 因此,没有办法通过设计来“修复”您的问题。检查
    Game.points
    就足够了。

    @FelixKling one希望更新的积分值为25?是的,我现在明白你的问题了。但是不是,赋值表达式的结果就是被赋值的值(即60)。我会使用逗号运算符-它更短:P var updatedPoints=((Game.points=60),Game.points);我正在将一个对象更改为getter setter格式,但是如果像上面所示的那样进行引用,这可能会对遗留代码中的现有引用产生副作用。@sbr啊,我明白了。那么,是的,你可能有问题,但我恐怕没有办法解决。尽管有人可能会争辩说,修改setter中的值是一种不好的做法,因为调用者并不希望发生这种情况。如果你能容忍这种行为,那么在
    x>25
    时抛出一个错误可以避免眼前的问题。祝你好运通过setter实现它的主要原因是验证和强制。你能想出一个更好的方法将验证器方法附加到每个赋值上吗?像这样简洁的东西。通常,验证不会修改输入,它会检查输入是否有效,如果无效,会以某种方式阻止输入。这就是我建议抛出异常而不是修改值的原因。除此之外我不知道。如果不真正投入到你的项目中,很难说什么对你有意义。。。