Подтвердить что ты не робот

Неверное поведение в 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 = новый Player (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

4b9b3361

Ответ 1

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

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

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

  • writable и value
  • get и set

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