Обзор
Типы объектов упоминались в первой статье этой серии статей.Объекты играют одну из важных ролей в JavaScript.Эта статья начнется спрототипЭта точка знаний вступает в свои права, и я надеюсь, что после прочтения этой статьи каждый сможет построить в уме полную ментальную карту.
Связь между функциями и объектами
Сначала мы должны убедиться, чтоФункция — это вызываемый объект, также упомянутый в первой статье этой серии, мы можем сделать следующую проверку:
(()=>{}) instanceof Object // true
Во-вторых, мы должны убедиться, чтоОбъекты создаются с помощью функций, например, литералы объектов, которые мы обычно пишем, на самом деле простоnew Object()
Это просто синтаксический сахар.
Зная два вышеуказанных момента, мы можем сказать, что функция — это своего рода объект, а объект создается функцией, поэтому объект создает объект. Вы чувствуете себя немного неловко? На самом деле, чтобы выяснить отношения между ними, не беспокойтесь об этих перипетиях.
Просто чтобы понять немного больше, в JavaScript, кромеObject
Есть также роль, котораяFunction
.
Давайте сначала посмотрим, что выводится в консоли браузера.Object
а такжеFunction
результат:
> Object
<· ƒ Object() { [native code] }
> Function
<· ƒ Function() { [native code] }
прототип
Прототипы относятся к ядру JavaScript, мы проанализируем их шаг за шагом, чтобы понять все аспекты прототипов.
prototype
а также[[Prototype]]
Мы знаем, что функции являются вызываемыми объектами, а поскольку они являются объектами, функции также являются наборами свойств. Одним из таких свойств являетсяprototype
Свойства, также известные как прототипы.Все функции имеютprototype
Атрибуты (Function.prototype.bind()
исключение). а такжеprototype
это объект, который имеетconstructor
атрибут указывает на эту функцию. Это представлено картой разума, и вы можете распечатать соответствующую информацию в окне браузера для подтверждения.
Это ясно из рисунка можно увидетьfunction Foo()
а такжеFoo.prototype
отношение, и мы увидим экземпляр объектаfoo
есть один__proto__
атрибут указывает наFoo.prototype
.__proto__
Мы называем это неявным прототипом, это просто встроенное свойство объекта.[[Prototype]]
Нестандартная реализация , хотя браузеры и поддерживают ее, но не рекомендуется.
Чтобы облегчить понимание следующего выражения,[[Prototype]]
Встроенные свойства будут использовать__proto__
Выражать.
Рекомендуется в ES6
Object.getPrototypeOf()
метод возврата объекта[[Prototype]]
,использоватьObject.setPrototypeOf()
метод установки объекта[[Prototype]]
.
Сделайте еще один шаг вперед
мы знаемFoo.prototype
тоже объект, то его__proto__
Куда он указывает?
мы знаемfunction Object()
также является функцией, поэтому она имеет те же правила, что и обычный конструктор, за исключением того, чтоObject.prototype
В верхней части цепочки прототипов посмотрите на картинку:
Из рисунка видно,Foo.prototype
из__proto__
указал наObject.prototype
,Object.prototype
Это тоже объект, это__proto__
указал наnull
, что должно быть легко понять, что означает, что он достиг вершины.
Тайна
Время разгадать тайну, также упомянутую вышеfunction Function()
тоже функция, не так ли иfunction Foo()
а такжеfunction Object()
А как насчет тех же правил? Ответ положительный, смотрите картинку ниже:
В дополнение к вышеперечисленным правилам, мы также должны отметить несколько моментов:
-
function Foo()
,function Object()
из__proto__
Указывает атрибутыFunction.prototype
,это означаетфункционировать черезFunction
Конструкторnew
от; -
function Function()
является исключением, хотя и__proto__
Также указалFunction.prototype
, но сначала строится двигательFunction.prototype
, а потомfunction Function()
, так что вы не создаете себя; -
Function.prototype
из__proto__
указал наObject.prototype
, потому что движок сначала создаетObject.prototype
Затем создатьFunction.prototype
, и использовать оба__proto__
Связаться.
Сеть прототипов
На рисунке выше нарисована цепочка стрелок, указывающих через__proto__
Соединение атрибутов, это цепочка прототипов.
Конкретно это можно понимать так: при поиске признака объекта, если он не найден, он будет следовать за__proto__
Найдите в объекте-прототипе, на который указывает свойство, вплоть доObject.prototype
, эта строка поиска называется цепочкой прототипов.
Суммировать
Для облегчения понимания необходимо краткое изложение:
-
Object.prototype
а такжеFunction.prototype
это два специальных объекта, созданных движком, так что не беспокойтесь о том, откуда взялись эти два объекта; - объекты могут проходить
__proto__
имущество найденоObject.prototype
,Object.create(null)
Создайте объект исключения, потому что нет__proto__
Атрибуты; - функция может пройти
__proto__
имущество найденоFunction.prototype
; - Объекты — это функции
new
выйти, за исключением двух вышеперечисленных особых предметов; - функциональный
prototype
это объект, он имеетconstructor
Свойство указывает на сам конструктор; - объект
__proto__
указать на прототип,__proto__
Соединение объектов и прототипов образует цепочку прототипов.
Вы спросите, а какая от них польза? Это касается вопроса классов и наследования, увидимся в следующей статье!
Увлекательная серия JavaScript
Письмо - это процесс обучения, пытаясь написать эту серию, в основном для консолидации базис JavaScript и попытаться понять их знания, чтобы иметь возможность использовать. Benpian выпустил одновременно в общественном номере «End Technology», если есть ошибка или нестроенное место, обязательно дайте мне правильно, очень благодарны!
Вся серия будет продолжать обновляться и не закончится.