JavaScript является единственным широко используемым языком для наследования прототипов, поэтому требуется время, чтобы понять различия между двумя методами наследования.
Первое основное отличие состоит в том, что JavaScript использует прототипные цепи для наследства:
function foo () {this.value = 42;} foo.prototype = {method: function () {}}; function bar () {}Установить прототип бара в экземпляр объекта Foo:
Bar.prototype = new foo (); bar.prototype.foo = 'hello world';
Убедитесь, что конструктор бара сам по себе является, и создайте новый экземпляр объекта бара:
Bar.prototype.constructor = bar; var test = new Bar ();
Давайте посмотрим на композицию всей цепи прототипа:
Тест [экземпляр bar] bar.prototype [экземпляр Foo] {foo: 'hello world'} foo.prototype {method: ...} object.prototype {toString: ... / * и т. Д. * /}В приведенном выше примере тест объекта будет наследовать как bar.prototype, так и foo.prototype. Следовательно, он может получить доступ к методу функции, определенным в Foo. Конечно, это также может получить доступ к значению свойства. Следует отметить, что когда New Bar () не создается, новый экземпляр Foo используется повторно, но экземпляр Foo, который поставляется с его объектом прототипа. Точно так же все экземпляры баров имеют один и тот же атрибут значения. Давайте приведем примеры:
test1 = new Bar (); test2 = new Bar (); Bar.prototype.value = 41; test1.value // 41 test2.value // 41
Прототип механизм поиска цепи
При доступе к свойствам объекта JavaScript пройдет всю цепь прототипа из самого объекта, пока не найдет соответствующие свойства. Если вы достигнете вершины цепочки прототипа, которая является объектом. Прототип в приведенном выше примере, и все еще не найдены атрибуты, то JavaScript вернет неопределенное значение.
Свойства объектов прототипа
Хотя свойства объекта прототипа используются JavaScript для построения цепочки прототипа, мы все равно можем присвоить ему значения. Но копирование исходного значения в прототип является недействительным, например:
function foo () {} foo.prototype = 1; // нет эффектаВот отвлечение от этой статьи и представьте, что является исходным значением:
В JavaScript переменные могут хранить два типа значений, а именно исходное значение и эталонное значение.
1. Примитивное значение:
Исходные значения являются фиксированными и простыми значениями, которые являются простыми сегментами данных, хранящимися в стеке, то есть их значения напрямую хранятся в месте, где доступ к переменной.
Существует пять типов примитивных типов: неопределенные, нулевые, логические, число, строка.
2. Справочное значение:
Опорное значение представляет собой относительно большой объект, объект, хранящийся в куче кучи, то есть значение, хранящееся в переменной, является указателем указателя, указывающим на память, где хранится объект. Все эталонные типы интегрированы из объекта.
Прототип проблемы производительности цепочки
Если найденные атрибуты расположены в верхней части цепочки прототипа, процесс поиска, несомненно, окажет негативное влияние на производительность. Это будет ключевым фактором, когда в сценариях необходимы требования к производительности. Кроме того, попытка найти свойства, которого не существует, пересекает всю цепь прототипа.
Точно так же при переселении свойств объекта все свойства в цепочке прототипа будут доступны.
Суммировать
Понимание прототипа наследования является предпосылкой для написания более сложного кода JavaScript, и вы также должны обратить внимание на высоту цепочки прототипа в коде. При столкновении с узкими местами производительности вы должны научиться разделять цепочку прототипа. Кроме того, чтобы отличить прототип объекта прототипа от прототипа __proto__, мы в основном обсудим прототип прототипа объекта здесь, и мы не будем объяснять проблему о прототипе __proto__.