Задать вопрос
@Rapen

Какой принцип работы встроенного метода в прототипе?

Имеется встроенный метод hash, прототипа Object, которая принимает строку, содержащую многоуровневый доступ вот пример:
obj = {
  person: {
    name: 'joe',
    history: {
      hometown: 'bratislava',
      bio: {
        funFact: 'I like fishing.'
      }
    }
  }
};

obj.hash('person.name'); // 'joe'
obj.hash('person.history.bio'); // { funFact: 'I like fishing.' }
obj.hash('person.history.homeStreet'); // undefined
obj.hash('person.animal.pet.needNoseAntEater'); // undefined

Вот две разные реализации hash, делают они одно и тоже:
1)
Object.prototype.hash = function(string) {
  return string.split('.').reduce(function(p,n) {
    return p && p[n];
  }, this);
};

2
)Object.prototype.hash = function(string) {
  var obj = this;
  string.split(".").forEach(function(el) { 
    try {
      obj = obj[el];
    }
    catch(e) { 
      obj = undefined;
    }
  });
  return obj;
}

Как работает каждая?
  • Вопрос задан
  • 531 просмотр
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
@mmxdesign
Software Engineer
Смысл прототипа - это написать одну функцию и привязать ее к общему типу (типа родителю) и тогда дети (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 внутри этих функций...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы