Javascript setter返回值而不进行验证

sbr*_*sbr 3 javascript javascript-engine getter-setter javascript-objects ecmascript-5

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
Run Code Online (Sandbox Code Playgroud)

'updatedPoints'的预期价值是25!

知道为什么会发生这种情况吗?你能否建议是否有办法解决这个问题?

解决此问题的原因:确保JS代码按预期执行,可维护性!

dee*_*see 6

JavaScript simple assignement(=)根据规范(11.13.1)返回正确的值.此行为忽略了setter中发生的任何验证.

从规格:

生产AssignmentExpression:LeftHandSideExpression = AssignmentExpression的计算方法如下:

  1. lref成为评估LeftHandSideExpression的结果.
  2. rref成为评估AssignmentExpression的结果.
  3. rval为GetValue(rref).
  4. 如果满足以下条件,则抛出SyntaxError异常:
    • Type(lref)是Reference为true
    • IsStrictReference(lref)是真的
    • Type(GetBase(lref))是环境记录
    • GetReferencedName(lref)是" eval "或" arguments "
  5. 调用PutValue(lref,rval).
  6. 返回rval.

所以没有办法按照设计"修复"你的问题.检查Game.points应该足够了.