Виды и перебор свойств

Личные и наследуемые свойства

Объект имеет личные свойства, что мы ему указали при создании и/или добавили, обратившись к этому объекту непосредственно.

const fruit = {
    weight: 50,
};

const banana = Object.create(fruit, {
  name: { writable: true, configurable: true, value: 'banana' },
  price: { writable: true, configurable: true, value: 30 },
});

console.log(banana);

// name & price - личные свойства объекта banana 
// weight - наследуемое (доступное через прототип) свойство

Наследуемые свойства всегда доступны через прототип текущему объекту от родителя и предков, но ему лично они не добавлялись и не принадлежат.

Чтобы проверить, является ли какое-либо свойство личным для конкретного объекта, используется метод hasOwnProperty(). Вызов этого метода на объекте, у которого мы проверяем личные свойства, вернет нам true, если указанный строчный ключ принадлежит указанному объекту лично, в противном случае (то есть этот ключ есть, но где-то в цепочке прототипов, а она может быть достаточно длинной) - вернет false.

banana.hasOwnProperty('name'); // true
banana.hasOwnProperty('price'); // true

banana.hasOwnProperty('weight'); // false

Перебор свойств

Для перебора используется цикл for...in. Он перебирает личные и наследуемые свойства через прототип, поэтому, если нас интересует перебор только личных свойств, нужно указывать условие с проверкой свойства с hasOwnProperty()

for (let prop in banana) {
    console.log(prop); // покажет все три свойства: weight, name & price
    if(banana.hasOwnProperty(prop)) {
        console.log(prop); // покажет только личные свойства: name & price
    }
}

Можно упростить работу с перебором свойств. используя методы конструктора Object, которые преобразуют в массив только личные свойства объекта, а с полученным массивом уже работать, как с обычным массивом, используя множество его методов и способов для перебора.

Object.keys()

Object.keys(obj)принимает объект и возвращает массив ключей его собственных свойств. Если в объекте нет свойств, метод вернёт пустой массив.

Object.values()

Object.values(obj) возвращает массив значений его собственных свойств. Если в объекте нет свойств, метод Object.values(obj) вернёт пустой массив.

Object.entries()

Object.entries(obj) возвращает массив записей, каждым элементом которого будет еще один массив из 2-х элементов: имени свойства и значения этого свойства из объекта obj.

Last updated