Предисловие
Я видел такой вопрос на сегменте:
var f = function () {}; object.prototype.a = function () {}; Function.prototype.b = function () {}; var f = new f ();Q: Может ли F получить A и B? Какой принцип?
На первый взгляд я был очень смущен. После тщательного изучения я обнаружил, что до сих пор не понимал прототип, поэтому я суммировал его и заполнил дыру ~
Функция и объект
Прежде чем решить проблему, давайте поговорим о прототипе, цепочке прототипа и взаимосвязи между функцией и объектом, что также является в центре внимания этой статьи.
прототип
При создании функции будет автоматически создан объект прототипа, к которому можно получить доступ через свойство прототипа функции.
Создайте объект экземпляра конструктора, который будет содержать указатель (внутреннее свойство) внутри него, указывая на объект прототипа конструктора. ECMA-262 5-е издание этого указателя называется [[Прототип]]. Хотя нет стандартного способа доступа [[прототип]] в сценариях, Firefox, Safari и Chrome поддерживают свойство __proto__ на каждом объекте для доступа к объекту прототипа их конструктора.
Позвольте мне снова сказать что -то важное:
Конструктор обращается к объекту прототипа через свойство прототипа.
Объект экземпляра обращается к объекту прототипа через внутренний атрибут [[[Prototype]], а браузер реализует атрибут _proto_ для объекта экземпляра для доступа к объекту прототипа.
var f = function () {}; var f = new f (); // Предполагая, что объект прототипа F равен P, затем // f.prototype === P; // f .__ Proto__ === P;Повторить снова. Полем Прототип относится к взаимосвязи между конструктором и объектом прототипа, а __proto__ относится к взаимосвязи между объектом экземпляра и объектом прототипа.
Прототип цепочка
Класс A наследует B, B наследует C ... Фактически, существует прототип объект с указателем, указывающим на B в объекте прототипа A, и объект прототипа с указателем, указывающим на C в объекте прототипа ... Обратите внимание, что это соединение между объектами прототипа. Не существует взаимосвязи между тремя конструкторами ABC, поэтому она называется «цепочка прототипов» ~
Предполагая, что a является объектом экземпляра A, прототип цепочка A показана на фиолетовой линии на рисунке ниже, а оранжевая линия соединяет конструктор и его объект прототипа.
Как видно из рисунка, конец цепочки прототипа является объектом. При поиске свойства или метода a, сначала посмотрите, есть ли сам сама или нет. Если нет, найдите вдоль цепочки прототипа, пока она не найдена или, наконец, не вернется в неопределенную после нуля.
Функция и объект
Отношения между функцией и объектом немного запутаны:
Объект является конструктором. Поскольку это функция, это объект функции экземпляра; Функция является конструктором, но функция. Прототип является объектом. Поскольку это объект, это объект экземпляра объекта.
Все объекты являются экземплярами объекта, и все функции являются экземплярами функции.
Объект - это экземпляр функции, а функция. Прототип - это экземпляр объекта.
Связь между ними показана на рисунке ниже.
Как видно, объект как конструктор, он имеет атрибут прототипа, указывающий на Object.Prototype, и как объект экземпляра, он имеет объект .__ Proto__, указывающий на function.prototype. Функция - это конструктор, он имеет атрибут прототипа, указывающий на функцию. Прототип, а функция - это функция, а также является экземпляром функции, поэтому он имеет функцию .__ Протоо, указывающий на функцию.
Это может быть подтверждено в хромированной консоли, как показано на рисунке.
Анализ исходного вопроса
Лучший способ решить проблему цепочки прототипа - это нарисовать картину. После предыдущего анализа эта картина не должна быть проблемой, следующим образом ~
Прототип цепочки F протягивается синей линией, поэтому F может получить доступ к A, но B не может получить доступ.
Если вы не нарисуете картинку, на первый взгляд, вы можете подумать, что F может получить доступ к b. Это может быть похоже на меня, что F.Prototype указывает на функционирование.
Поэтому вы должны нарисовать картину всякий раз, когда проблема с цепочкой прототипа ~
Расширенная тема
В приведенном выше вопросе F может только получить доступ только к A, но не б. Но F может получить доступ к A и B. Если вы измените вопрос на следующее, каков результат FB ()? Почему? Вы можете подумать об этом ~
var f = function () {}; object.prototype.a = function () {}; Function.prototype.b = function () {console.log ('f .__ Proto__')}; F.prototype.b = function () {console.log ('f.prototype');};Суммировать
После прочтения вы нашли особую особенность функции?
Для общего объекта существует только один атрибут __proto__, используемый для доступа к объекту прототипа его конструктора, и для функции это как функция, так и объект.
В качестве функции он рождается с атрибутом прототипа, указывающим на свое имя функции объекта прототипа. Прототип.
Как объект функции экземпляра, он имеет атрибут __proto__, указывающий на function.prototype
Обычно эти два свойства указывают на два объекта, но оба свойства функции указывают на одно и то же, оба указывают на функционирование. Прототип.
Для функции a () методы в A.Prototype предназначены для вызова его объекта экземпляра и не будут использоваться сами по себе; Когда A запускается в качестве экземпляра, методы в протоо .______ вызываются. Другими словами, при использовании в качестве конструктора принимается цепочка A.Prototype, а методы и атрибуты присваиваются их примерам; Когда используется в качестве объекта, используется цепочка A .__ Proto__. В разных сценариях не неправильно различать его идентичность.
После всей статьи я чувствую, что то, что я сказал, довольно ноет ... Пожалуйста, поправьте меня, если есть какие -либо недостатки ~ Что касается вопроса, я действительно не знаю, как это назвать. Полем
Пусть эта статья принесет вам некоторые выгоды после прочтения ~ ^_ ^
Спасибо за поддержку этого сайта. Мы будем продолжать обновлять соответствующую информацию в будущем, чтобы помочь вам изучить и понять эту часть знаний!