При объяснении кода на основе прототипов гораздо проще использовать Object.create
для объяснения вещей.Object.create
- это функция, которая получает объект-прототип и создает новый объект-экземпляр, который имеет объект-прототип в качестве [[prototype]]
Когда поиск свойств в объекте работает следующим образом:
Каждый объект имеет свое собственное и неизменное свойство [[prototype]] внутри.Это свойство является секретным и скрытым, если вы не находитесь в Firefox, где вы можете получить его через __proto__
.
Когда читает свойство вверх, мы сначала ищем его в самом объекте иесли мы не найдем его там, мы рекурсивно ищем [[prototype]] объекта.
Когда записывает свойство, мы всегда пишем свое собственное свойство (мы никогда не изменяем [[прототип]], даже если он также имеет свойство, которое мы устанавливаем).
proto = {a:1};
child1 = Object.create(proto);
child2 = Object.create(proto);
child1.a = 2;
console.log(proto.a); //1
console.log(child1.a); //2
console.log(child2.a); //1
При создании функции
Всякий раз, когда мы создаем объект функции в Javascript,он поставляется с уже заполненным свойством prototype
. Этот prototype
является объектом (унаследованным от Object.prototype) и имеет свойство constructor
, установленное на соответствующую функцию.
При создании экземпляраобъект, использующий конструктор функции (новый Foo)
Создается новый объект с функциями prototype
в качестве [[prototype]] и запускается функция объекта для его инициализации.
I dна самом деле не хочу объяснять, что происходит в первом случае, поскольку часть
Foo.prototype = FooProto;
не имеет никакого смысла и, вероятно, не то, что вы хотели сделать (помните, что прототипы должны быть объектами, а не функциями)
Что касается второго случая, изменение свойства prototype
функции конструктора повлияет только на будущие экземпляры (anotherObj).Свойство [[prototype]] уже созданных объектов является секретным и неизменным, поэтому вы ничего не можете сделать, чтобы изменить их.
- Обратите внимание, что если вы хотите динамически изменить прототип и существующие объекты (это можно сделать, записав и перезаписав значения в существующем объекте-прототипе вместо его замены новым.