Подробно объясните прототип и __proto__ в цепочке прототипов.

внешний интерфейс JavaScript Язык программирования

предисловие

Эта статья в основном подробно объясняетпрототип и __proto__Для чего это нужно, я полагаю, что многие студенты, как и я, тупо путаются в том, как их использовать? , Какую роль он играет в цепочке прототипов? , какую роль он играет в наследовании? , Почему JavaScript разработал эти два свойства? В ожидании серии вопросов, я искал много информации в Интернете, и я был сбит с толку.Далее в этой статье я объясню вышеперечисленные проблемы в простой для понимания форме, а также использую ее в качестве своих собственных учебных заметок.

Зачем создавать прототип и __proto__

JavaScript не имеет понятия классов

Если вы знакомы с Java, объектно-ориентированным языком программирования, вы должны быть знакомы с концепцией классов.В объектно-ориентированном языке программирования вы сначала проектируете класс, а затем генерируете экземпляр класса (создаете его экземпляр в виде объект). ноВ языке javascript нет понятия класса, все типы данных являются объектами (object), Это не проблема, не все языки программирования должны полагаться на концепцию классов, как в java, язык C не имеет концепции классов, та же жизнь очень хороша. Но мы должны признать, что классы — это идеи, которые облегчат решение инженерных задач. Если вы хотите построить масштабный проект, он неизбежно будет включать в себя наследование, наследование, и вам нужно реализовать его через классы, но в javascript нет понятия классов, так что же нам делать?Мы можем имитировать классы, поэтому прототип и производный __proto__.

Вы также можете обратиться к Учителю Жуань Ифэну:Идея дизайна механизма наследования Javascript

типы данных в javascript

Прежде чем объяснять прототип и __proto__, давайте сначала объясним типы данных в javascript. Зачем сначала говорить о типах данных, потому что прототип и __proto__ используют два типа данных, функцию и объект. Существует два типа типов данных javascript:

  • базовый тип данных: Номер строки Логическое значение Null undefined
  • ссылочный тип данных: Массив Объект Дата Функция RegExp и т.д.

мы можем использоватьtypeofЧтобы судить о типе данных переменной, все 5 основных типов данных могут быть оценены по типу (Null — это объект), в то время как ссылочный тип данных может судить только о двух типах объекта и функции, то есть на самом деле есть два типы ссылочных типов.Objectа такжеFunction, другие типы являются производными от типа Object.

код показывает, как показано ниже:

Функция и объект

В приведенном выше объяснении мы сосредоточимся на двух типах функций и объектов.

Разница между функцией и объектом
  • Функция может быть выполнена
  • Функцию можно использовать в качестве конструктора объекта.Например, когда мы используем новый оператор, за которым следует функция, функция будет использоваться в качестве конструктора для возврата объекта. код показывает, как показано ниже:

Из приведенного выше рисунка видно, что сам конструктор является функцией, а экземпляр, возвращаемый конструктором, на самом деле является объектом.

  • Функция-конструктор имеет свойство прототипа, в то время как экземпляр объекта не имеет свойства прототипа. код показывает, как показано ниже:

После выяснения отношений между функцией и объектом мы затем объясним, какую роль играют прототип и __proto__ в наследовании.

Какую роль прототип и __proto__ играют в наследовании

В таких языках, как java, концепция наследования реализована между классами и классами, а в javascript вообще нет классов, все объекты являются объектами, поэтому в javascript концепция наследования реализована через объекты и объекты.

При рассмотрении наследования javascript область ограничена ссылочными типами данных.Хотя ссылочные типы данных делятся на два типа: функция и объект, с точки зрения наследования нет необходимости различать функцию и объект, а нужно только рассматривать как объект.

Итак, как именно javascript определяет отношения наследования? ответproro

__proto__ отличается от прототипа, прототип существует только в функции, а __proto__ существует в функции и объекте.

код показывает, как показано ниже:

Кратко резюмируем суть наследования javascript:Объект B, на который указывает свойство __proto__ объекта A, B, является объектом-прототипом (или родительским объектом) объекта A. Объект A может использовать свойства и методы объекта B, а также может использовать объект-прототип C объекта B. , свойств и методов, рекурсивно, это так называемая цепочка прототипов

Образец кода:

Приведенный выше код реализует простейшее наследование в javascript, вроде ничего, а __proto__ реализует проблему наследования. Что еще делают прототипы? Какую роль прототип играет в наследовании?На самом деле, что действительно прототип делает, когда функция используется в качестве конструктора.Поскольку __proto__ не является атрибутом, определенным официальным стандартом, атрибут прототипа используется для имитации наследования между классами и классами. модель.

Затем сосредоточьтесь на анализе процесса построения объектов с типом Function.Когда вы знаете, что сделал новый оператор, вы будете знать роль прототипа.

Что именно делает новая операция

Благодаря приведенному выше анализу мы знаем, что p — это тип объекта, а Parent — это тип функции. В java, если так писать, Parent должен быть классом, а в javascript класса нет, а мы очень хотим учиться на этом синтаксисе. Что делать? Эту задачу можно передать только Function. Взгляните на полный код:

Приведенный выше способ написания — это классический конструктор конструкции, но что делает new?

  • Шаг 1: Родитель выполняется. Когда используется новое ключевое слово, родительская функция будет выполняться в области действия p, так что это экземпляр p, так что три свойства имени, возраста и хобби будут созданы как свойства p,
  • Шаг 2: Укажите p.__proto__ на Parent.prototype, который является сутью конструктора, поэтому p наследует свойства и методы в Parent.prototype (и в его цепочке прототипов). Проверьте следующим образом:

Таким образом создается живой экземпляр.

Суммировать

Наконец, мы заканчиваем ответом на Stack Overflow с наибольшим количеством голосов по этому вопросу, который объясняет это очень просто.

Вот ответ:

__proto__is the actual object that is used in the lookup chain to resolve methods, etc. prototype is the object that is used to build __proto__when you create an object with new

переводить:

__proto__ — это объект, который фактически используется для поиска цепочки прототипов для получения метода.

прототип — это объект, используемый для построения __proto__ при создании объекта с новым