2014-04-10 4 views
1

반환, 그냥 "일반"값이 아닌 게터/세터와 같은 객체의 속성을 정의 할 수 있습니다 : 자바 스크립트가 아닌 값을 특성

Object.defineProperty(obj, 'complex_property', { 
    get: function getter() { return this.protected; }, 
    set: function setter(value) { this.protected = value; } 
}); 

은 비를 반환하는 방법이 있나요 이 getter 함수가 먼저 평가되지 않고 객체의 value 속성을 평가할 수 있습니까?

obj.property = function(name) { return this.[ name ]; }; 

// Doesn't work: 
// ReferenceError: invalid assignment left-hand side 
obj.property('complex_property') = 5; 

마지막 줄 효과적으로 6 = 5 읽기 - 분명 오류 - this.complex_property가 먼저 평가되기 때문에, 다음 돌아왔다. 클로저와 getter-setter 속성을 결합하는 것은 "개인"속성을 시뮬레이션하고 실제 get/set 함수를 사용하지 않고도 할당 값을 검증하는 효과적인 방법입니다. 현대 자바 스크립트의 더 나은 기능 중 하나입니다. 저평가 된 getter/setter 속성을 반환하는 방법이 있다면 그것은 더 좋을 것입니다. 내가 놓친 방법이 있습니까 아니면 그냥 불가능한가요? 우리는 set(prop, value) 기능을 사용하여 붙어 있습니까?

답변

0

불행히도 JavaScript 기능에서는이 기능을 사용할 수 없습니다. 사용자 코드로 작성된 모든 JavaScript 함수는 참조가 아닌 값만 반환 할 수 있습니다 (ES6부터는 브라우저에서 코드로도 가능하지 않음). (굵게 강조는) 다음과 같은

ReturnStatement이 평가 다음 표현가 존재하지

  1. 경우를 반환 (반환, 정의되지 않은 빈).
  2. exprRef를 표현식을 계산 한 결과라고 합니다.
  3. Return (반환, GetValue (exprRef), 비어 있음).

이렇게하는 유일한 방법 것은 set(property, value) 함수를 사용하거나 실제 세터를 만드는 하나.

0

속성을 얻을 수 있습니다. 음, 적어도 속성 설명자. 그리고 그것은 예쁘지 않습니다.

var prop = Object.getOwnPropertyDescriptor(obj /* from question */, 'complex_property'); 
prop.set.call(obj, 5); 

편집 :

obj.property = function (name) { return Object.getOwnPropertyDescriptor(this, name); } 
obj.property('complex_property').set.call(obj, 5); 
관련 문제