Мне просто нужна четкая и краткая причина назначения свойства прототипа, которое на данный момент имеет некоторый смысл, но все еще не имеет смысла с точки зрения его вклада в цепочку наследования.
Давайте возьмем этот код для примера:
function Foo(prop) {
this.fooProperty = prop
}
Foo.prototype.greetFoo = function() {
console.log('hi from foo')
}
function Bar(prop1, prop2) {
Foo.call(this, ...arguments)
this.barProperty = prop2
}
// Replace the default Bar.prototype object with one that links to Foo.prototype
Bar.prototype = Object.create(Foo.prototype)
Bar.prototype.greetBar = function() {
console.log('hi from bar')
}
const barInstance1 = new Bar('baz', 'rar')
const barInstance2 = new Bar('qum', 'yas')
barInstance1.greetFoo()
barInstance2.greetFoo()
barInstance1.greetBar()
barInstance2.greetBar()
Приведенное выше приведёт к следующей цепочке прототипов:
Object.prototype <- Foo.prototype <- Bar.prototype <- barInstance1
> greetFoo() > greetBar() > fooProperty = 'baz'
> barProperty = 'rar'
<- barInstance2
> fooProperty = 'qum'
> barProperty = 'yas'
В традиционных ООП классы являются «чертежами», а экземпляры - объектами, созданными из«сплющенные / объединенные» чертежи иерархии наследования экземпляра класса. JS «Наследование» работает иначе, чем это. Наследование JS работает с использованием иерархии связанных, живых объектов, а не чертежей.
Когда вы обращаетесь к чему-то в экземпляре, которого у экземпляра нет (например, greetFoo()
и greetBar()
), JS будет рекурсивно искать цепочку, чтобы найти ее. Эта цепочка может включать другие прототипы с большим количеством функций. Вот как работает JS «Обмен кодом».
В приведенном выше примере
barInstance1
и barInstance2
связаны с Bar.prototype
. Оба экземпляра теперь имеют greetBar()
. Bar.prototype
, а также ссылки на Foo.prototype
, что означает, что экземпляры также получают greetFoo
. - Наконец,
Foo.prototype
ссылки на встроенныев Object.prototype
предоставление всем экземплярам доступа ко всем собственным методам объектов, таким как hasOwnProperty
, toString()
и т. д.