2016-09-06 2 views
0

Я пытаюсь определить getter для моего объекта. Тем не менее, я также хочу иметь возможность указать свойство этого сеттера.Getter/setter with defineProperty

Пример объекта:

var obj = { 
    weight: 14 
}; 

Теперь я хочу, чтобы создать функцию, которая расширяет этот объект так, когда она классически называется obj.weight, «14» будет возвращен. Но, я хочу также иметь возможность позвонить obj.weight.unit и получить «Килограммы» взамен.

Это то, что я пытался сделать:

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

Получение веса работает, но получить вес блока не работает. Также, когда я пытаюсь увидеть контекст «obj» в консоли, он просто не показывает «unit», как будто его не существует.

+0

С какой синтаксис вы намерены получить единицу? 'Obj.weight.unit'? 'Obj.unit'? –

+0

То, что вы пытаетесь сделать, невозможно. Вы не можете иметь значение как число, так и объект с свойством 'unit'. – Bergi

ответ

1

Берги прав пока 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 Да, в JS есть много тонких точек, например, при создании экземпляра с помощью «нового» ключевого слова арифметические операторы рассматривают объект «Number» как примитив, в то время как вы можете свободно присоединять к ним свойства, поскольку это объекты на самом деле. Для меня это напоминает монадическое поведение в Haskell. – Redu

Смежные вопросы