Каковы другие способы создания свойств объекта в JS с перечисляемым значением false по умолчанию?

Перечисляемые свойства — это свойства, внутренний флаг [[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, когда вы впоследствии выполняете простое присваивание.


person Marina Dunst    schedule 14.02.2016    source источник


Ответы (1)


Насколько мне известно, использование Object.defineProperty — единственный способ изменить перечисляемый флаг. До ES5 у нас не было такого механизма.

person Scott Marcus    schedule 14.02.2016
comment
Object.defineProperty() может быть единственным способом изменить флаг перечисления. Когда я создал новый Object(), его перечисляемые атрибуты будут установлены в false. Поэтому, когда я сделал defineProperty(), я не трогал перечисления, они по-прежнему ложны. - person Marina Dunst; 15.02.2016