Я читаю книгу под названием «Шаблоны JavaScript», но есть одна часть, в которой, как мне кажется, парень сбивает с толку.
Этот парень фактически привел в книге шаблон проектирования классов, где он разработал его по частям. Сначала он представляет проблему:
function inherit(C, P) {
C.prototype = P.prototype;
}
Он говорит:
"Это дает вам короткие и быстрые цепочки поиска прототипов, потому что все объекты на самом деле имеют один и тот же прототип. Но это также ОТДЕЛКА, потому что если один ребенок или внук
где-то вниз по цепочке наследования изменяет прототип, это влияет на всех родителей
и бабушка с дедушкой. "
Однако на самом деле я попытался изменить прототип say () в Child, и это никак не повлияло на Parent, и фактически Child по-прежнему указывал на Parent и полностью игнорировал свой собственный прототип с тем же именем, что имеет смысл, поскольку он указывает на другая позиция памяти. Так как парень может сказать что-то подобное? Ниже доказывается моя точка зрения:
function Parent(){}
Parent.prototype.say = function () {
return 20;
};
function Child(){
}
Child.prototype.say = function () {
return 10;
};
inherit(Child, Parent);
function inherit(C, P) {
C.prototype = P.prototype;
}
var parent = new Parent();
var child = new Child();
var child2 = new Child()
alert(child.say(); //20
alert(parent.say()); //20
alert(child2.say()); //20
Ни один ребенок или внук не может изменить прототип!
Это приводит ко второму пункту. Он говорит, что решение проблемы возможности случайного изменения родительских прототипов вниз по цепочке наследования (которую я не могу воспроизвести) состоит в том, чтобы разорвать прямую связь между родительским и дочерним прототипом, и в то же время извлечь выгоду из цепочки прототипов. В качестве решения он предлагает следующее:
function inherit(C, P) {
var F = function () {};
F.prototype = P.prototype;
C.prototype = new F();
}
Проблема в том, что при этом выводятся те же точные значения, что и в другом шаблоне:
function Parent(){}
Parent.prototype.say = function () {
return 20;
};
function Child(){
}
Child.prototype.say = function () {
return 10;
};
inherit(Child, Parent);
function inherit(C, P) {
var F = function () {};
F.prototype = P.prototype;
C.prototype = new F();
}
var parent = new Parent();
var child = new Child();
var child2 = new Child()
alert(child.say(); //20
alert(parent.say()); //20
alert(child2.say()); //20
Не имеет смысла, что пустая функция как-то разрывает ссылку. Фактически, Child указывает на F, а F в свою очередь указывает на прототип Родителя. Таким образом, они все еще указывают на одну и ту же позицию памяти. Это продемонстрировано выше, где выводятся те же точные значения, что и в первом примере. Я не имею ни малейшего понятия, что этот автор пытается продемонстрировать и почему он заявляет, что мне это не нужно и что я не могу воспроизвести.
Спасибо за ответ.