Что такое прототип? Прототип — это концепция, о которой мы не упоминали при базовом изучении JS. Прототип — это общий термин, который в основном включает в себя. Объект-прототип (прототип) , Прототип объекта (__proto__) , цепочка прототипов Подождите, по статистике, эти понятия тоже часто задают на собеседованиях. Эта статья поможет вам понять и освоить соответствующие знания о прототипах, чтобы вы больше не путались.
Мы изучали многие объектно-ориентированные языки, такие как Java, C++ и т. д., но JavaScript является исключением. До ES6 не было понятия классов. Так как же мы раньше создавали объекты? Оказывается, до ES6 мы использовали конструкторы для создания экземпляров объектов. Конструктор — это специальная функция, которая содержит общедоступные характеристики объекта. Ее имеет смысл использовать только в сочетании с new .
<script> function Animal(name,age){ //Первая буква имени конструктора пишется с заглавной this.name=name; this.age=возраст; this.eat=function(){ console.log('Я ем'); } } vardog=new Animal('Wangcai',3) //Используется вместе с new для создания объекта console.log(dog.name); console.log(dog.age); собака.есть() </скрипт>
<script>. функция Animal(имя,возраст){ это.имя=имя; this.age=возраст; } var собака = новое животное('Ванцай',3) console.log(собака.имя); console.log(Animal.name); </скрипт>
<script>. функция Animal(имя,возраст){ это.имя=имя; this.age=возраст; } var собака = новое животное('Ванцай',3) Animal.color='черный' console.log(Animal.color); console.log(dog.color); </скрипт>
Прежде чем начать объяснять, что такое объект-прототип, давайте сначала объясним случай. Мы только что создали несколько экземпляров объектов и вывели два метода. их экземпляры. После сравнения мы обнаружили, что выводится false, то есть адреса сложных типов данных у них разные. В чем причина?
<скрипт> функция Animal(имя,возраст){ это.имя=имя; this.age=возраст; this.eat=function(){ console.log('Я ем'); } } var собака = новое животное('Ванцай',3) var cat=new Animal('Мими',3) var pig=new Animal('хмхем',3) var fish=new Animal('Gulu',3) var овца=новое животное('咩咩',3) console.log(dog.eat==cat.eat); </скрипт>
Когда мы создаем экземпляр объекта, новый процесс сначала создает новый объект, но сложные типы данных открывают пространство для хранения (объектов, методов), что приводит к бесчисленным открытиям для одного и того же метода в блочной памяти конструктора. вызывая крайнюю трату памяти
Прототип конструктора — это атрибут внутри конструктора. Его атрибут представляет собой указатель, указывающий на объект. Методы, хранящиеся в этом объекте, затем используются для создания экземпляров с помощью конструктора. использоваться публично при преобразовании объектов, и нет необходимости открывать несколько дублирующихся пространств памяти для нескольких идентичных сложных типов данных. Чтобы решить вышеупомянутую проблему нерационального использования памяти, его также можно напрямую назвать объектом-прототипом.
Решение: мы используем объект-прототип для хранения общедоступного метода, позволяем созданному объекту вызывать метод и сравниваем, совпадают ли адреса двух
<script> функция Animal(имя,возраст){ это.имя=имя; this.age=возраст; } Animal.prototype.eat=function(){ console.log('Я ем'); } var собака = новое животное('Ванцай',3) var cat=new Animal('Мими',3) собака.есть() кот.есть() console.log(dog.eat==cat.eat); </script>
Мы обнаружили, что этот метод не только был успешно вызван, но и адреса двух вызывающих методов были одинаковыми. Это доказывало, что его общедоступный комплексный тип данных только открывал пространство памяти, уменьшая количество записанных общедоступных методов. конструктор раньше. Проблема растраты ресурсов внутри функций.
Функция прототипа объекта __proto__ позволяет вам ответить на вопрос: почему метод, добавленный в атрибут прототипа конструктора, может использоваться при создании экземпляра объекта? Это связано с тем, что каждый объект имеет атрибут __proto__ (обратите внимание, что до и после этого атрибута есть два подчеркивания). Этот атрибут также является указателем, указывающим на прототип объекта-прототипа соответствующего конструктора, что объясняет, почему в созданном объекте можно вызывать методы. объект-прототип.
Следует отметить, что функция прототипа объекта __protp__ заключается только в предоставлении направления для поиска содержимого в объекте-прототипе. Нам не нужно его использовать, нам нужно только помнить, что он. указывает на соответствующий конструктор. Прототип объекта-прототипа — это
прототипом объекта-конструктора __proto__, а прототип объекта-прототипа функции-конструктора имеет. атрибут конструктора, поэтому он называется конструктором. Он называется конструктором, потому что этот атрибут указывает на сам соответствующий конструктор. Он в основном используется для записи, на какой конструктор ссылается созданный объект
<script>. функция Animal(имя,возраст){ это.имя=имя; this.age=возраст; } Animal.prototype.eat=function(){ console.log('Я ем'); } var собака = новое животное('Ванцай',4) console.log(dog.__proto__.constructor); console.log(Animal.prototype.constructor); </скрипт>
Мы обнаружили, что напечатанный результат действительно является самим конструктором.