Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность
Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
предисловие
Знание прототипа и цепочки прототипов всегда было в центре внимания при проведении интервью. Давайте начнем с вопроса интервью для аппетита:
function User() {}
User.prototype.sayHello = function() {}
var u1 = new User();
var u2 = new User();
console.log(u1.sayHello === u2.sayHello);
console.log(User.prototype.constructor);
console.log(User.prototype === Function.prototype);
console.log(User.__proto__ === Function.prototype);
console.log(User.__proto__ === Function.__proto__);
console.log(u1.__proto__ === u2.__proto__);
console.log(u1.__proto__ === User.__proto__);
console.log(Function.__proto__ === Object.__proto__);
console.log(Function.prototype.__proto__ === Object.prototype.__proto__);
console.log(Function.prototype.__proto__ === Object.prototype);
фундамент
-
JavaScript
Все объекты по существу проходят черезnew 函数
созданных, включая литералы объектов в виде определенных объектов (эквивалентныхnew Object()
грамматический сахар). -
new Function
Object
,Array
Ждать
prototype
Каждая функция имеет свойствоprototype
, это прототип, по умолчанию обычныйObject
Объект, являющийся прототипом экземпляра, созданного путем вызова этого конструктора.
contructor属性
JavaScript
Также есть свойства, указывающие на конструктор из прототипа:constructor
,Прямо сейчасFunc.prototype.constructor --> Func
__proto__
JavaScript
Все объекты в (кромеnull
) есть__proto__
свойство, указывающее на прототип объекта.
function User() {}
var u1 = new User();
// u1.__proto__ -> User.prototype
console.log(u1.__proto__ === User.prototype) // true
Очевидно, экземпляр__proto__
Свойство указывает на прототип конструктора, затем на несколько экземпляров__proto__
Укажет ли он на один и тот же прототип?
var u2 = new User();
console.log(u1.__proto__ === u2.__proto__) // true
Если несколько экземпляров__proto__
Оба указывают на прототип конструктора, если экземпляр можно запрограммировать в прототипе, если метод, атрибут и т. Д. Можно запрограммировать, и наследование может быть запрограммировано, а эффект наследования может быть запрограммирован.
Продолжим обновлять диаграмму отношений между прототипом и цепочкой прототипов:
Сеть прототипов
Когда объект экземпляра ищет атрибут, если он не может его найти, он будет следовать__proto__
Перейдите к прототипу, связанному с объектом, чтобы найти его, если вы не можете его найти, перейдите к прототипу прототипа, пока не найдете верхний уровень, который является концепцией цепочки прототипов.
Вот несколько примеров цепочек прототипов с помощью вопросов интервью:
Пример
-
u1.sayHello()
:u1
НетsayHello
u1.__proto__(User.prototype)
, успешно получен доступ кsayHello
метод -
u2.toString()
u2,User.prototype
ничегоtoString
метод,User.prototype
User.prototype.__proto__(Object.prototype)
toString
метод
улучшать
function A() {}
function B(a) {
this.a = a;
}
function C(a) {
if (a) {
this.a = a;
}
}
A.prototype.a = 1;
B.prototype.a = 1;
C.prototype.a = 1;
console.log(new A().a); //1
console.log(new B().a); //undefined
console.log(new C(2).a); //2
Но чего-то еще не хватает при решении первоначальных вопросов интервью в статье, таких какFunction.__proto__ === Object.__proto__、Function.prototype.__proto__ === Object.prototype.__proto__
Подождите, давайте решать это один за другим.
Objcet.__proto__
,Object.prototype
,Object.prototype.__proto__
-
Object
Это конструктор, во второй части мы рассказали все функции черезnew Function
создан, так чтоObject
эквивалентноFunction
экземпляр, то естьObject.__proto__ --> Function.prototype
. -
Object.prototype
даObject
Object.prototype.__proto__
Нет верхнего прототипа, на который можно было бы указать, поэтому его значение равноnull
// 总结:
Object.__proto__ --> Function.prototype
Object.prototype.__proto__ --> null
Function.__proto__
,Function.prototype
,Function.prototype.__proto__
-
Function.prototype
даFunction
Прототип — это прототип всех экземпляров функций, таких как приведенный выше.Object.__proto__
-
Function.prototype
обычный объект, поэтомуFunction.prototype.__proto__ --> Object.prototype
-
Function.__proto__
:__proto__
указывает на прототип создавшего его конструктора, который его создалFunction
Это?-
Гипотеза: объекты-функции также являются объектами, тогда
Function.__proto__
укажет наObject.prototype
? упомянутый выше,Object.__proto__ --> Function.prototype
. еслиFunction.__proto__ -> Object.prototype
, всегда странно, кто кого создал, поэтому я провел тест:
Object.__proto__ --> Function.prototype
-
Не результат напряженного мышления, не так ли?
Function
Функция не обезьяна и из щели в камне выпрыгнула? Так что я провел кучу тестов вместе, и я не ожидал найти зацепку.
Function.__proto__ --> Function.prototype
Function
Функция ничего не создает,JS
Когда двигатель запустится, добавьте его в память. -
Суммировать
Наконец, знание прототипа и цепочки прототипов сводится к картинке:
- Все функции (включая
Function
)из__proto__
направлениеFunction.prototype
- Экземпляр пользовательского объекта
__proto__
- функциональный
prototype
из__proto__
направлениеObject.prototype
Object.prototype.__proto__ --> null
послесловие
var F = function () {}
Object.prototype.a = function () {}
Function.prototype.b = function () {}
var f = new F();
console.log(f.a, f.b, F.a, F.b);
// 原型链
// f.__proto__ --> F.prototype --> Object.prototype
// F.__proto__ --> Function.prototype --> Object.prototype
Часть источника этой статьи: Учебные материалы Duyi Education.