Я пытаюсь понять наследование прототипов Javascript, и у меня возникают проблемы с пониманием связи между экземплярами объектов и свойством прототипа их соответствующих классов, в котором хранятся унаследованные методы.
Я понимаю, что определение методов в свойстве прототипа класса позволяет экземплярам получать доступ / наследовать эти методы, чтобы методы не переопределялись. Предположительно это достигается путем предоставления экземпляру указателя на метод в памяти (или что-то очень похожее на это). Я также понимаю, почему добавление методов в свойство prototype класса позволяет ранее созданным экземплярам получать доступ к этим «новым» методам, поскольку экземпляры просто получают доступ к свойству prototype (которое включает в себя класс, из которого они происходят), которое, в свою очередь, обращается к свойству prototype класса.
Что я не понимаю , так это следующий сценарий:
Я определяю тривиальный объект с помощью метода:
function Person(name) {
this.name = name;
}
Person.prototype.greeting = function() {
return "Hello, " + this.name;
}
Я создаю экземпляр и могу получить доступ к данным:
var p = new Person("Ryan");
p.name //"Ryan"
p.greeting() //"Hello, Ryan"
Я переопределить Персона без приветствие:
Person = function (name) {
this.name = name;
}
Я все еще могу использовать приветствие в предыдущем экземпляре:
p.greeting() //"Hello, Ryan" but expected error
Если при переопределении Person он перезаписывает предыдущий конструктор Person в памяти, как получается, что экземпляр "p" может по-прежнему обращаться к методу приветствия, если больше нет такого метода, связанного с Person? Это тот случай, когда экземпляры фактически копируют расположение методов своих унаследованных классов в собственном поле прототипа? Если это так, то почему всегда говорят о «цепочке прототипов», которую процессор должен «подойти», чтобы найти унаследованные методы, если экземпляр хранит расположение этих методов непосредственно в их собственном поле прототипа?
Помощь очень ценится. Я прошу прощения, если есть что-то простое, что я пропустил.