Да, всеобъемлющий объект «Объект» создается один раз, и на его прототипы ссылаются различные объекты JavaScript (JS), такие как массив или другие созданные объекты. Но если вы создали объект, который наследуется от другого созданного вами объекта суперкласса, его __proto__
сначала будет ссылаться на прототип объекта суперкласса в его цепочке прототипов.
Когда вы создаете объект и вызываете метод, JS ищет метод, проходя через цепочку прототипов. Если JS не находит метод в объекте, он попытается делегировать метод из суперкласса объекта. Если он все еще не находит метод, он делегирует еще один уровень и, в конечном итоге, объекту «Объект». Предположим, вы создали объект Person как суперкласс для объекта Hero:
let Person = function(name) {
this.name = name;
}
Person.prototype.greet = function() {
console.log("Hello, my name is " + this.name + ".")
}
let Hero = function(name) {
Person.call(this, name);
}
Hero.prototype = Object.create(Person.prototype);
Hero.prototype.constructor = Hero;
Hero.prototype.fight = function(villain) {
console.log("Hero, " + this.name + ", defeated " + villain + "!");
}
В строке Hero.prototype = Object.create(Person.prototype);
вы разрешаете JS делегировать Person.prototype
для Hero.prototype
. Здесь Hero.prototype.__proto__
указывает на Person.prototype
. Если метод не найден ни в Hero.prototype
, ни в Person.prototype
, то в конечном итоге он делегирует до Object.prototype
, что находится в его цепочке прототипов [[Prototype]]
(@RobG спасибо за разъяснение этого).