Javascript setter返回值而不进行验证

时间:2014-01-23 01:42:44

标签: 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 ;

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 个答案:

答案 0 :(得分:6)

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

来自规范:

  

生产 AssignmentExpression LeftHandSideExpression =    AssignmentExpression 评估如下:

     
      
  1. lref 成为评估 LeftHandSideExpression 的结果。
  2.   
  3. rref 成为评估 AssignmentExpression 的结果。
  4.   
  5. rval 为GetValue( rref )。
  6.   
  7. 如果满足以下条件,则抛出 SyntaxError 异常:   
        
    • 类型( lref )是参考 true
    •   
    • IsStrictReference( lref true
    •   
    • 类型(GetBase( lref ))是环境记录
    •   
    • GetReferencedName( lref )是“ eval ”或“参数
    •   
  8.   
  9. 调用PutValue( lref rval )。
  10.   
  11. 返回 rval
  12.   

所以没有办法按照设计“修复”你的问题。检查Game.points就足够了。