Как узнать количество уровней прототипного наследования объекта?

Рейтинг: -2Ответов: 2Опубликовано: 18.01.2023

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

Для проверки:

const obj = { a: 1 };
const obj2 = Object.create(obj);
const obj3 = Object.create(obj2);

console.log(layersOfInheritance({})); // 0
console.log(layersOfInheritance(new Date())); // 1
console.log(layersOfInheritance(obj3)); // 2

Можно использовать рекурсию и метод Object getPrototypeOf.

Ответы

▲ 0

Можно использовать рекурсию и метод Object getPrototypeOf.

Предложу такой вариант...

const obj = { a: 1 };
const obj2 = Object.create(obj);
const obj3 = Object.create(obj2);

console.log(layersOfInheritance({})); // 0
console.log(layersOfInheritance(new Date())); // 1
console.log(layersOfInheritance(obj3)); // 2

//
function layersOfInheritance(obj, lv = -1) {
    const o = Object.getPrototypeOf(obj)
    return o ? layersOfInheritance(o, lv + 1) : lv
}

▲ 0

Можно (и нужно) без рекурсии:

const obj = { a: 1 };
const obj2 = Object.create(obj);
const obj3 = Object.create(obj2);

const layersOfInheritance = (obj) => {
  let layersCount = 0;
  let prototype = Object.getPrototypeOf(obj);
  
  while (prototype !== null) {
    ++layersCount;
    
    prototype = Object.getPrototypeOf(prototype);
  }
  
  return layersCount - 1;
}

console.log(layersOfInheritance({})); // 0
console.log(layersOfInheritance(new Date())); // 1
console.log(layersOfInheritance(obj3)); // 2

В конце вычитаем единицу, потому что цепочка наследования всегда будет заканчиваться так obj -> ... -> Object -> null, и насколько я понимаю по вашим выходным данным этот последний Object вам не нужен