Неправильное поведение в объекте 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
атрибуты.