2013-10-13 9 views
12

sto cercando di creare un oggetto con setter e getter, e questo è il mio codice:Comportamento errato in Google Chrome Object.defineProperty?

var Player = function(height){ 
    var _height = height; 

    Object.defineProperty(this, 'height', { 
     enumerable: false 
    , configurable: true 
    , writable: false 
    , get: function(){return _height;} 
    , set: function(val){_height = val;} 
    }); 
} 

var myPlayer = new Player (10);

Anche se la proprietà delle opzioni defineProperty writable è impostata su false, ottengo il seguente errore:

Invalid property. A property cannot both have accessors and be writable or have a value, #<Object>

Lo stesso sta accadendo quando il writable è impostato su vero, naturalmente, ma l'errore scompare se rimuovo la riga writable.

Sto facendo qualcosa di sbagliato, o si tratta di un bug? Ciò sta accadendo su Google Chrome, versione 30.0.1599.66

+1

L'errore sembra descrittivo ... Perché dovresti avere un getter e setter per una proprietà non scrivibile? – elclanrs

+1

L'errore viene visualizzato in entrambi i casi, 'writable: true' e' writable: false'. Non è strano? – Loupax

+1

Puoi solo avere gli attributi 'writable' e' value' o 'get' e' set', non una qualsiasi combinazione di essi. Dato che specifichi 'writable', non puoi usare' get' o 'set'. Vedi [Mozilla MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) –

risposta

32

Il Mozilla MDN per Object.defineProperty chiarisce questo:

Property descriptors present in objects come in two main flavors: data descriptors and accessor descriptors. A data descriptor is a property that has a value, which may or may not be writable. An accessor descriptor is a property described by a getter-setter pair of functions. A descriptor must be one of these two flavors; it cannot be both.

Ciò significa che è possibile utilizzare uno di quelli:

  • writable e value
  • get e set

Ma non è possibile utilizzare alcuna combinazione di essi. Nell'esempio, si specifica l'attributo writable, che indica che si tratta di un descrittore di dati, che non consente gli attributi get e set.