Обязательные прототипы для экспериментов с JavaScript

JavaScript
Обязательные прототипы для экспериментов с JavaScript

Обзор

Типы объектов упоминались в первой статье этой серии статей.Объекты играют одну из важных ролей в 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__Выражать.

Рекомендуется в ES6Object.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, эта строка поиска называется цепочкой прототипов.

Суммировать

Для облегчения понимания необходимо краткое изложение:

  1. Object.prototypeа такжеFunction.prototypeэто два специальных объекта, созданных движком, так что не беспокойтесь о том, откуда взялись эти два объекта;
  2. объекты могут проходить__proto__имущество найденоObject.prototype,Object.create(null)Создайте объект исключения, потому что нет__proto__Атрибуты;
  3. функция может пройти__proto__имущество найденоFunction.prototype;
  4. Объекты — это функцииnewвыйти, за исключением двух вышеперечисленных особых предметов;
  5. функциональныйprototypeэто объект, он имеетconstructorСвойство указывает на сам конструктор;
  6. объект__proto__указать на прототип,__proto__Соединение объектов и прототипов образует цепочку прототипов.

Вы спросите, а какая от них польза? Это касается вопроса классов и наследования, увидимся в следующей статье!

Увлекательная серия JavaScript

Письмо - это процесс обучения, пытаясь написать эту серию, в основном для консолидации базис JavaScript и попытаться понять их знания, чтобы иметь возможность использовать. Benpian выпустил одновременно в общественном номере «End Technology», если есть ошибка или нестроенное место, обязательно дайте мне правильно, очень благодарны!

Вся серия будет продолжать обновляться и не закончится.

полный каталог

1. Поэкспериментируйте с типами данных JavaScript

2. Обязательные прототипы для работы с JavaScript