2016-09-06 5 views
0

Ich versuche, einen Getter für mein Objekt zu definieren. Ich möchte aber auch auf eine Eigenschaft dieses Setter zeigen können.Getter/Setter mit defineProperty

Beispiel Objekt:

var obj = { 
    weight: 14 
}; 

Jetzt möchte ich eine Funktion erstellen, die dieses Objekt erstreckt sich so, wenn es klassisch als obj.weight genannt wird, ‚14‘ zurückgegeben. Aber ich möchte auch die Möglichkeit haben, obj.weight.unit anzurufen und dafür 'Kilogramme' zu bekommen.

Dies ist, was ich zu tun versucht:

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

Erste das Gewicht funktioniert, aber die Gewichtseinheit immer nicht funktioniert. Auch wenn ich versuche, den Kontext von "obj" in der Konsole zu sehen, zeigt es einfach nicht "unit" an, als ob es nicht existiert.

+0

Mit dem, was Syntax wollen Sie das Gerät bekommen? 'obj.weight.unit'? 'obj.unit'? –

+0

Was Sie versuchen, ist unmöglich. Ein Wert kann nicht sowohl eine Zahl als auch ein Objekt mit einer 'Einheit'-Eigenschaft sein. – Bergi

Antwort

1

Bergi ist rechts noch JS diese Wrapper-Objekte für Primitive hat. Wie das Number-Objekt. Für Ihren Fall kann ich eine Lösung wie folgt finden;

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

... so ist es nicht unmöglich! (Was für eine verrückte Sprache!) –

+0

@Nick Perkins Ja, es gibt viele subtile Punkte in JS, wie zum Beispiel wenn mit dem 'new' Schlüsselwort instanziiert die arithmetischen Operatoren das' Number' Objekt wie ein Primitiv behandeln, während Sie diese Eigenschaften seither frei anhängen können Sie sind tatsächlich Objekte. Für mich ähnelt das dem monadischen Verhalten in Haskell. – Redu

Verwandte Themen