Неверное поведение в 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
Ответы
Ответ 1
Mozilla MDN для Object.defineProperty
проясняет это:
Дескрипторы свойств, присутствующие в объектах, представлены в двух основных вариантах: дескрипторы данных и дескрипторы доступа. Дескриптор данных - это свойство, которое имеет значение, которое может быть или не быть доступным для записи. Дескриптор доступа - это свойство, описываемое парой функций getter-setter. Дескриптор должен быть одним из этих двух вариантов; это не может быть и то, и другое.
Это означает, что вы можете использовать любой из них:
-
writable
и value
-
get
и set
Но вы не можете использовать какую-либо комбинацию из них. В вашем примере вы указываете атрибут writable
, что означает, что это дескриптор данных, который запрещает атрибуты get
и set
.