автор:HerryLo
Эта статья имеет постоянную действующую ссылку: https://github.com/AttemptWeb......
Цепочка прототипов и объект-прототип являются ядром js. В форме цепочки прототипов js гарантирует, что методы и свойства в функциях или объектах могут быть переданы вниз. Согласно объектно-ориентированному подходу, это наследование. А js может реализовать наследование функций или объектов через цепочку прототипов, поэтому поговорим о цепочке прототипов в js.Большинство фотографий ниже, пожалуйста, ешьте с уверенностью.
прототип и конструктор
прототип указывает на объект-прототип функции, который является явным свойством прототипа, которое есть только у функций..contructorУказатель на конструктор объекта-прототипа.
// 可以思考一下的打印结果,它们分别指向谁
function Foo() {}
console.log(Foo.prototype)
console.log(Foo.prototype.constructor)
console.log(Foo.__proto__)
console.log(Foo.prototype.__proto__)
Давайте посмотрим на отношения между каждым конструктором и его собственным объектом-прототипом:
proto
Каждый объект имеет_proto_
, которое является неявным свойством прототипа, указывающим на прототип конструктора, который создал объект. Поскольку в js нет понятия класса, чтобы добиться наследования, передайте_proto_
Связывая объекты и прототипы в цепочку прототипов, вы можете разрешить объектам доступ к свойствам, которые им не принадлежат.
Связь между функциями и объектами
Foo, Function и Object — все функции, их_proto_
оба указывают наFunction.prototype
.
Связь между объектами-прототипами
их_proto_
все указывают наObject.prototype
. Цепочка прототипов js в конечном итоге указывает на объект прототипа Object.
_proto_ схема цепочки прототипов
Я считаю, что если вы понимаете приведенную выше диаграмму, вы уже должны понимать цепочку прототипов js.
Суммировать
- Функция и объект — это две функции.
- protoСоединение объектов и прототипов образует цепочку прототипов.
- всех функцийprotoОба указывают на объект-прототип Function.
- Цепочка прототипов js, наконец, указывает на объект-прототип Object (Object.prototype)(здесь я не указал значение null).
Смотрите больше сообщений в блоге: