#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