2016-09-06 2 views
0

내 객체에 대한 getter를 정의하려고합니다. 그러나, 나는 또한 그 세터의 속성을 가리킬 수있는 능력을 갖고 싶어.defineProperty가있는 Getter/setter

예 개체 :

var obj = { 
    weight: 14 
}; 

가 지금은 그것이 고전 obj.weight로 불리는 그래서이 객체를 확장하는 기능을 만들려는 '14'반환됩니다. 그러나 나는 또한 obj.weight.unit을 호출하고 '킬로그램'을받는 옵션이 필요합니다.

이것은 내가 할 뭘하려 :

Object.defineProperty(obj, 'weight', { 
    get: function() { 
     return obj.weight; 
    }, 
    'unit': 'Kilograms' 
}); 

무게를 얻기 작동하지만 작동하지 않습니다 중량 단위를 받고. 또한 콘솔에서 "obj"의 컨텍스트를 보려고 할 때, 존재하지 않는 것처럼 "단위"를 표시하지 않습니다.

+0

어떤 구문을 사용하면 장치를 얻을 하시겠습니까? 'obj.weight.unit'? 'obj.unit'? –

+0

당신이하려는 것은 불가능합니다. 값은'unit' 속성을 가진 숫자와 객체가 될 수 없습니다. – Bergi

답변

1

BERGI는 JS가 프리미티브 이러한 래퍼 개체가 아직까지입니다. Number 객체와 같습니다. 귀하의 경우 다음과 같은 해결책을 제시 할 수 있습니다.

var obj = { _weight : 14, 
 
      get weight(){ var n = new Number(this._weight+""); 
 
          n.unit = "kg"; 
 
          return n; 
 
      }, 
 
      set weight(v){ this._weight = v} 
 
      }; 
 
console.log(obj.weight); // returns a number object with PrimitiveValue of _weight property. 
 
console.log(obj.weight.unit); // returns "kg" 
 

 
// however you can still use obj.weight just like a primitive number in operations. 
 
obj.weight = 40; 
 
console.log(obj.weight/4) 
 
console.log(obj.weight.unit)

+0

... 불가능하지 않습니다! (무슨 미친 언어일까요?) –

+0

@Nick Perkins 네, 예를 들어, 'new' 키워드로 인스턴스화 할 때 JS의 많은 미묘한 점이 있습니다. 산술 연산자는'Number' 객체를 원시처럼 처리하는 반면에 자유롭게 속성을 첨부 할 수 있습니다. 사실 그들은 대상입니다. 나에게 이것은 하스켈의 모나드 행성과 닮았다. – Redu

관련 문제