Смысл прототипа - это написать одну функцию и привязать ее к общему типу (типа родителю) и тогда дети (instance) этого родителя могут иметь доступ к общей одной функции.. написал один раз пользуешься везде...
А касательно реализации hash, это уже чисто на вкус.. я так понял вопрос о прототипах или именно о методе hash?
1) метод использует метод
reduce который проходится по списку ['person', 'history', 'hometown'] и при каждой итерации внутри объект obj именьшается на ту часть по которой ключ совпал...
1. первый заход:
{
person: {
name: 'joe',
history: {
hometown: 'bratislava',
bio: {
funFact: 'I like fishing.'
}
}
}
2. второй заход
{
history: {
hometown: 'bratislava',
bio: {
funFact: 'I like fishing.'
}
}
3. третий заход
{
hometown: 'bratislava',
}
Надеюсь смысл понятен?
2) метод
forEach также сперва разбивает строку на список ['person', 'history', 'hometown']
и проходится с первым ключом и если находит возвращает тот объект (в нашем случаи person, затем history и тд) и на втором заходе уже сравнивает со вторым ключем
Вся магия происходит в callbackах, то есть каждый раз obj внутри функции уже не тот же obj что вначале функции.. вы можете это легко проверять путем console.log внутри этих функций...