Неправильное поведение в объекте Google Chrome.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 = новый игрок (10);

хотя writable свойство параметров defineProperty имеет значение false, я получаю следующую ошибку:

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

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

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

1 ответов


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

дескрипторы свойств, присутствующие в объектах, имеют два основных вида: дескрипторы данных и дескрипторы доступа. Дескриптор данных-это свойство со значением, которое может быть или не быть доступным для записи. Дескриптор доступа-это свойство, описываемое парой функций getter-setter. Дескриптор должен быть одним из этих двух ароматов; он не может быть обоими.

это означает, что вы можете используйте любой из них:

  • writable и value
  • get и set

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