Перечисляемые свойства — это свойства, внутренний флаг [[Enumerable]] которых установлен в значение true, что является значением по умолчанию для свойств, созданных с помощью простого присваивания или с помощью инициализатора свойства (свойства, определенные с помощью Object.defineProperty и т. п. по умолчанию). [[Enumerable]] в false).
var person = new Object();
//person = {"hair": "red", "eyes": "blue"};
Object.defineProperty(person, "gender", {value: "male"});
Object.defineProperty(person, "name", {value: "Joe"});
for (var prop in person) {
console.log(prop + " = " + person[prop]);
}
Это ничего не даст, даже ошибки, поскольку для перечислимых значений установлено значение false. Раскомментируйте простое назначение и закомментируйте defineProperty, это создаст
"hair": "red", "eyes": "blue".
MDN говорит: «... и тому подобное». Что ж, для меня Object.defineProperty — единственный способ создания свойств с перечисляемыми, для которых по умолчанию установлено значение false.
PS. Наверное, мне следует немного перефразировать. Когда я делаю новый Object(), для его перечисляемого атрибута по умолчанию устанавливается значение false, поэтому, когда я выполнял Object.defineProperty(), я не трогал перечислимый атрибут, он все еще остается ложным. Но для перечислимого устанавливается значение true, когда вы впоследствии выполняете простое присваивание.