@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;
}

Как работает каждая?
  • Вопрос задан
  • 521 просмотр
Пригласить эксперта
Ответы на вопрос 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 внутри этих функций...
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы