2013-10-13 8 views
12

Ich versuche, ein Objekt mit Getter und Setter zu schaffen, und dies ist mein Code:Falsches Verhalten 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);

Auch wenn die writable Eigentum der DefineProperty Optionen auf false gesetzt ist, ich die folgende Fehlermeldung erhalten:

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

Das gleiche geschieht, wenn die writable auf true natürlich gesetzt, aber der Fehler verschwindet, wenn ich die writable Zeile entferne.

Mache ich etwas falsch, oder ist das ein Fehler? Dies geschieht auf Google Chrome, Version 30.0.1599.66

+1

Fehler scheint deskriptiv ... Warum haben Sie einen Getter und Setter für eine nicht beschreibbare Eigenschaft? – elclanrs

+1

Der Fehler wird in beiden Fällen "schreibbar: wahr" und "schreibbar: falsch" angezeigt. Ist das nicht komisch? – Loupax

+1

Sie können nur entweder die Attribute 'beschreibbar' und' Wert' oder 'Get' und' Set' haben, keine Mischung davon. Da Sie 'writable' angeben, können Sie' get' oder 'set' nicht verwenden. Siehe [Mozilla MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) –

Antwort

32

Die Mozilla MDN für Object.defineProperty verdeutlicht dies:

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.

Das bedeutet, dass Sie entweder eine von denen verwenden können:

  • writable und value
  • get und set

Sie können jedoch keine Kombination von ihnen verwenden. In Ihrem Beispiel geben Sie das Attribut writable an, was bedeutet, dass es sich um einen Datendeskriptor handelt, der die Attribute get und set nicht zulässt.