3

JavaScript setter가 참조에서 내부 값을 업데이트하지만 반환 값이 올바르지 않습니다.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 코드가 예상대로 수행되는지 확인하려면 유지 관리가 필요합니다.

+0

@FelixKling은 updatedPoints 값이 25 일 것으로 예상합니까? – sbr

+0

그래, 이제 네 질문을 이해했다. 그러나 아니요, 할당 표현식의 결과는 지정된 값 (60)입니다. –

+0

쉼표 연산자를 사용합니다. 더 짧습니다 : P var updatedPoints = ((Game.points = 60), Game.points); –

답변

6

JavaScript 단순 지정 (=)은 사양 (11.13.1)에 따라 올바른 값을 반환합니다. 이 동작은 setter에서 유효성 검사가 수행되는 모든 작업을 무시합니다. 스펙에서

:

제조 AssignmentExpression : LeftHandSideExpression 다음 AssignmentExpression을 평가 =

  1. lref LeftHandSideExpression 평가 결과하자.
  2. rref지정 표현을 평가 한 결과입니다.
  3. 이어야합니다. GetValue (rref). 다음 조건에 모두 해당하는 경우
  4. 구문 에러 예외를 던져 :
    • 유형 ( lref ) 참조가 사실
    • IsStrictReference ( lref )입니다 사실
    • 유형입니다 (GetBase (lref))는 환경 기록입니다.
    • GetReferencedName이 ( lref ) "평가"또는 "인수"중 하나입니다
  5. 전화 위해서는 putValue (lref,rval에).
  6. 돌아 가기 예 :.

따라서 문제를 의도적으로 "수정"할 방법이 없습니다. Game.points을 확인하는 것으로 충분합니다.

+0

객체를 getter-setter 형식으로 변경하려고합니다. 그러나 위의 방법과 같이 참조하면 레거시 코드의 기존 참조에 부작용이있을 수 있습니다. – sbr

+0

@sbr 아하나. 그럼, 네, 문제가있을 수도 있지만 주위에 방법이 없습니다 두려워. 호출자가 그것을 기대하지 않기 때문에 setter의 값을 변경하는 것은 나쁜 습관이라고 주장 할 수도 있습니다. 당신이 그런 종류의 행동으로 살 수 있다면'x> 25'가 문제를 피할 수 있다면 오류를 던집니다. 행운을 빕니다! – Vache

+0

setter를 통해 구현하는 주된 이유는 유효성 검사와 강요입니다. 모든 과제에 대해 유효성 검사기 방법을 첨부하는 더 좋은 방법을 생각해 볼 수 있습니까? 이 같은 간결한 것. 감사합니다. – sbr

관련 문제