предисловие
Эта статья в основном подробно объясняетпрототип и __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__ при создании объекта с новым