Как можно создать функцию, которая будет выводить все ключи объекта, включая те, которые находятся в его прототипе?

Добрый день! Как можно создать функцию, которая будет выводить все ключи объекта, включая ключи, унаследованные от его прототипа? Получить ключи самого объекта не составляет труда, как это показано в следующем примере: <br/> <pre><code class="javascript">const obj = {
  name: 'Alex',
  age: 43,
}

Object.keys(obj).forEach((key) =&gt; {
  console.log(key)
})</code></pre> <br/> Однако у меня возникают трудности с извлечением ключей из прототипа. Не совсем ясно, имеются ли в виду ключи встроенных свойств или же ключи родительского объекта, который мы создали.
  • 24 апреля 2025 г. 5:45
Ответы на вопрос 3
Добрый день! Чтобы вывести все ключи объекта, включая унаследованные от его прототипа, можно использовать метод `for...in`, который перебирает все перечисляемые свойства объекта и его прототипов. 

Вот пример функции, которая выводит все ключи объекта:

```javascript
const obj = {
  name: 'Alex',
  age: 43,
};

// Добавим свойство к прототипу
Object.prototype.greeting = function() {
  return `Hello, my name is ${this.name}`;
}

function logAllKeys(obj) {
  for (let key in obj) {
    console.log(key);
  }
}

logAllKeys(obj);
```

В этом примере `for...in` перебирает все ключи, включая те, которые унаследованы от прототипа объекта `Object`. Однако учтите, что `for...in` выведет только перечисляемые свойства. Некоторые свойства, такие как методы, могут быть не перечисляемыми.

Если вам нужно получить только перечисляемые свойства, но также учитывать ключи с прототипа, нужно дополнительно рассмотреть использование `Object.getOwnPropertyNames()` и `Object.keys()` для добавления уникальных свойств, если это необходимо.

Если вам нужны все свойства, включая неперечисляемые, вы можете использовать метод `Reflect.ownKeys()`:

```javascript
function logAllKeysIncludingNonEnumerable(obj) {
  let keys = Reflect.ownKeys(obj);
  for (let key of keys) {
    console.log(key);
  }

  let prototype = Object.getPrototypeOf(obj);
  while (prototype !== null) {
    keys = Reflect.ownKeys(prototype);
    for (let key of keys) {
      console.log(key);
    }
    prototype = Object.getPrototypeOf(prototype);
  }
}

logAllKeysIncludingNonEnumerable(obj);
```

Этот код выведет все ключи, включая ключи из прототипа, как собственные, так и унаследованные, включая недоступные для `for...in`.
Абсолютно все не получится. Там <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Enumerability_and_ownership_of_properties#traversing_object_properties" rel="nofollow">хитрая таблица</a> . <br/> Невозможно одновременно получить non-enumerable own и enumerable inherited свойства, а non-enumerable inherited (созданные в родителе через Object.defineProperty) вообще не получить.
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in" rel="nofollow">https://developer.mozilla.org/en-US/docs/Web/JavaS...</a>
Похожие вопросы