Свойства с флагом ‘enumerable’ перечислены в цикле for / in?

#javascript

#javascript

Вопрос:

Я новичок в javascript и сейчас учусь. У меня есть приведенный ниже запрос относительно цикла for / in и атрибута ‘enumerable’ свойства объекта javascript.

Рассмотрим следующий фрагмент кода:

 var base = {x:1, y:2, z:3}
var derived = Object.create(base)
derived["a"]=4
for(var prp in derived) { console.log(prp, derived.propertyIsEnumerable(prp)) }
 

Для приведенного выше кода вывод:

a true
x false
y false
z false

Насколько я понимаю, унаследованные свойства не поддаются перечислению, и мой вопрос в том, почему они перечислены в цикле for / in .

Насколько я понимаю, вывод должен быть :

значение true.

Пожалуйста, поправьте меня, если я ошибаюсь?

Комментарии:

1. @IazertyuiopI: Что плохого в использовании объектного литерала для создания прототипа?

2. @Bergi Мой плохой — казалось бы, ничего, но я не знал об этом синтаксисе.

Ответ №1:

Из MDN:

У каждого объекта есть метод propertyIsEnumerable . Этот метод может определить, может ли указанное свойство в объекте быть перечислено с помощью for…in цикл, за исключением свойств, унаследованных через цепочку прототипов.

for..in будет выполняться итерация по любому из перечислимых свойств объекта, но propertyIsEnumerable только true для «собственных» перечислимых свойств объекта и false для унаследованных.

Комментарии:

1. Смотрите также эту таблицу: developer.mozilla.org/en-US/docs/… (Унаследованный Enumerable)

2. вы имеете в виду, что этот метод всегда возвращает ‘false’ для унаследованных свойств? Также, если свойство наследуется, будет ли у него атрибут ‘enumerable’ по умолчанию или атрибут также наследуется вместе со свойством?

3. ДА. Повторите тот же цикл base , и вы увидите, что свойства можно перечислить. Вот почему они отображаются в цикле for-in-поверх derived объекта. Атрибуты свойств наследуются, так сказать, да.

4. @Pradeep_Evol Да, он всегда будет возвращаться false для унаследованных свойств. И унаследованные свойства будут перечислимыми или неперечисляемыми в зависимости от того, являются ли они перечислимыми или неперечисляемыми в исходном объекте. Смотрите: jsfiddle.net/W6MkM