Q1: Когда я устанавливаю прототип B, я не понимаю, как будет обновляться свойство prototype B, когда / если будет обновлен прототип A. Я имею в виду, что он просто наследует / копирует все эти свойства.
Объекты функций имеют поле prototype
:
function A(name) { this.name = name }
print(A.prototype) // [object Object]
Когда вы создаете объект, используя new A
, результирующий объект содержит поле constructor
, которое является ссылкой на функцию конструктора:
var a = new A('Eric')
print(a.constructor == A) // True
print(a.constructor.prototype == A.prototype) // True
Если вы попытаетесь проиндексировать a
, а поле не определено, JavaScript попытается разрешить его с помощью прототипа a
(например, a.constructor.prototype
). Мы можем использовать это, чтобы добавить вещи ко всем A
экземплярам:
A.prototype.greet = function() { print('Hi, ' + this.name + '!') }
a.greet() // Hi, Eric!
Это разрешение поля работает рекурсивно.
function B(name) { this.name = name.toUpperCase() }
B.prototype = new A
b = new B("Eric")
b.greet() // Hi, ERIC!
В последней строке происходит то, что JavaScript не находит поле 'greet' в b
, поэтому он пытается создать прототип b
. Там его тоже нет, поэтому он пробует прототип *b
и так далее по цепочке, пока у него не закончатся прототипы.
Переводчик знает, как отрубить свойство прототипа А:
B.prototype.prototype
Ничего не отрубается, вы просто смотрите не на ту вещь. Вы хотите:
B.prototype.constructor.prototype