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