2013-10-13 5 views
12

Я пытаюсь создать объект с сеттеров и добытчиками, и это мой код:Неверное поведение в 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;} 
    }); 
} 

вар myPlayer = новый плеер (10);

Даже несмотря на то, writable свойство опций defineProperty устанавливается в ложь, я получаю следующее сообщение об ошибке:

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

То же самое происходит, когда writable установлена ​​истина, конечно, но ошибка исчезает, если я удалю линию writable.

Я делаю что-то неправильно или это ошибка? Это происходит на Google Chrome, версия 30.0.1599.66

+1

Ошибка кажется описательной ... Почему у вас есть геттер и сеттер для свойства, недоступного для записи? – elclanrs

+1

Ошибка отображается в обоих случаях: «writeable: true» и «writeable: false». Разве это не странно? – Loupax

+1

Вы можете использовать либо атрибуты 'writable', и' value', или 'get' и' set', а не любую их смесь. Поскольку вы указываете 'writable', вы не можете использовать' get' или 'set'. См. [Mozilla MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) –

ответ

32

Mozilla MDN для Object.defineProperty разъясняет это:

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.

Это означает, что вы можете использовать либо один из них:

  • writable и value
  • get и set

Но вы не можете использовать какую-либо комбинацию из них. В вашем примере вы указываете атрибут writable, что означает, что это дескриптор данных, который запрещает get и set атрибутов.