> For the complete documentation index, see [llms.txt](https://aleksandra-hrevtsova.gitbook.io/senior-front-end-javascript/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://aleksandra-hrevtsova.gitbook.io/senior-front-end-javascript/obekty/vidy-i-perebor-svoistv.md).

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

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

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

```
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`.
