предисловие
Давным-давно, когда он был еще относительно белым, коллега такой-то, код ниже покажите мне
function A(){}
A.__proto__.__proto__.__proto__
Тогда спросите меня, эти вещи нижеA.__proto__.__proto__.__proto__
Что это такое, а то я обалдел, прототип еще немного знает, это__proto__
, еще три, какого черта. Вот и не могу отпустить эту проблему. Хоть я и ленив и не люблю тратить мозги, но до сих пор не могу преодолеть это препятствие. Последние два дня я долго учился, и У меня есть эта статья.
Что касается ответа, посмотрите на заголовок этой статьи и знайте, что значение равно null.
Я был очень ответственен, чтобы сказать вам, что следующее значение NULL:new
Это создается.
function A(){}
var a = new A();
a.__proto__.__proto__.__proto__
У кого есть проблемы
typeof === object
(кроме нуля) есть__proto__
typeof === function
да__proto__
а такжеprototype
Ни нуль, ни неопределенный
что такое __прото__
__proto__
Общий случай относится к прототипу конструктора объекта, общий случай, потому что бывают очень общие случаи.
Давайте сначала посмотрим на простой пример, следующий вывод верен
function A(){}
var a = new A()
console.log(a.__proto__ === A.prototype)
a.__proto__.__proto__
Как сделать вывод?
Согласно вышеуказанномуa.__proto__ === A.prototype
,
Такa.__proto__.__proto__
эквивалентноA.prototype.__proto__
,
продолжать получатьa.prototype.constructor.prototype
, а потом идешь на сравнение, результат ложный.
Таким образом, цепочка прототипов воспроизводится на основе некоторых правил.
a.__proto__.__proto__ === A.prototype.constructor.prototype
// false
несколько правил
Давайте сначала не будем об этом беспокоиться, давайте посмотрим на картинку выше, мы должны сначала знать или помнить эти правила.
-
Object.prototype.__proto__ === null
Object.__proto__ === Function.prototype
То естьObject.__proto__ === Function.prototype === Function.__proto__
Object.constructor.prototype === Function.prototype
// true
Function.constructor === Function
// true
Function.prototype.__proto__ === Object.prototype
Есть ли точка, где все является объектом в дизайне.
Function.prototype.constructor === Object
// false
Пользовательские функции по умолчанию, такие какfunction Person(){}
Существуют следующие правила:Person.prototype.__proto__ === Object.prototype
Person.constructor === Function
основная тема
С этими основными вещами мы можем сделать вывод.
Посмотрите на код ниже,
js давайте нажмемA.__proto__.__proto__.__proto__
function A(){}
var a = new A()
A.__proto__
Конструктор — это функция
A.constructor === Function
A.__proto__ === Function.prototype
A.__proto__.__proto__
A.__proto__.__proto__ === Function.prototype.__proto__
в соответствии сFunction.prototype.__proto__ === Object.prototype
A.__proto__.__proto__ === Function.prototype.__proto__ === Object.prototype
A.__proto__.__proto__.__proto__
A.__proto__.__proto__.__proto__ === Object.prototype.__proto__
в соответствии сObject.prototype.__proto__ === null
A.__proto__.__proto__.__proto__ === null
На данный момент мы пришли к выводу, что часть заголовка завершена.
Где это, продолжаем выводить следующий код
function A(){}
var a = new A();
a.__proto__.__proto__.__proto_
Или приведенный выше код, мы затем выводимa.__proto__.__proto__.__proto__
a.__proto__
Конструктор a - это A
a.constructor === A
a.__proto__ === a.constructor.prototype
a.__proto__ === A.prototype
a.__proto__.__proto__
a.__proto__.__proto__ === A.prototype.__proto__
Согласно правилу 3, снова обращаясь к рисунку,Foo.prototype.__proto__ === Object.prototype
a.__proto__.__proto__ === A.prototype.__proto__ === Object.protype
a.__proto__.__proto__.__proto__
a.__proto__.__proto__.__proto__ === Object.protype.__proto__
Object.prototype.__proto__ === null
a.__proto__.__proto__.__proto__ === null
Расширение темы плюс наследование
Давайте еще раз посмотрим на отношение наследования
function Parent(){}
function Child(){}
Child.prototype = new Parent()
var child = new Child();
Parent.__proto__.__proto__.__proto__ === null
Нечего сказать об этом.
Child.prototype.__proto__.__proto__.__proto__
Первый взглядChild.prototype.__proto__.__proto__.__proto__
Child.prototype.__proto__
Child.prototype.__proto__ === Child.prototype.constructor.prototype
Прототипом Child.prototype является экземпляр Parent, а конструктором прототипа Child является Parent, поэтому
Child.prototype.__proto__ === Parent.prototype
Child.prototype.__proto__.__proto__
Child.prototype.__proto__.__proto__ === Parent.prototype.__proto__
Ссылаясь на схему,Foo.prototype.__proto__ === Object.prototype
Child.prototype.__proto__.__proto__ === Object.prototype
Child.prototype.__proto__.__proto__
Child.prototype.__proto__.__proto__ .__proto__=== Object.prototype.__proto__ === null
child.__proto__.__proto__.__proto__ .__proto__
посмотри сноваchild.__proto__.__proto__.__proto__ .__proto__
child.__proto__
child.__proto__ === Child.prototype
child.__proto__.__proto__
child.__proto__.__proto__ === Child.prototype._proto__ === Child.prototype.constructor.prototype === Parent.prototype
child.__proto__.__proto__.__proto__
child.__proto__.__proto__.__proto__ === Parent.prototype.__proto__
Ссылаясь на фиг.Foo.prototype.__proto__ === Object.prototype
child.__proto__.__proto__.__proto__ === Parent.prototype.__proto__ === Object.prototype
child.__proto__.__proto__.__proto__.__proto__
child.__proto__.__proto__.__proto__.__proto__ === Object.prototype.__proto__ === null
В сочетании с количеством текста
Взгляните на следующий код
function Grandpa(){}
function Parent(){}
Parent.prototype = new Grandpa();
function Child(){}
Child.prototype = new Parent()
var child = new Child()
Давайте проанализируем ребенкаprototype
а также__proto__
, скажете вы, нет вам конца,
Дальше не буду анализировать, выведу формулу:
Производная формула
- Любая пользовательская функция, по умолчанию, три раза
.__proto__
должен быть нулевым
То есть ищите три поколения, включая Function, Object, Error и т. д.
в соответствии сObject.__proto__ === Function.prototype === Function.__proto__
Давайте выведемFunction.__proto__.__proto__ .__proto__
первый шаг:Function.__proto__ === Function.prototype
Шаг 2:Function.__proto__.__proto__ === Function.prototype.__proto__ === Object.protetype
третий шаг:Function.__proto__.__proto__ .__proto__ ===Object.protetype.__proto__ === null
построены функцией
Давайте проверим ССС
Child.__proto__.__proto__.__proto__ === null // true
- Функция Fn отношения наследования, если число наследования равно n,
fn = new Fn()
;
Такfn.__proto__[3 + n] === null
ребенок должен быть 3+2 это 5 раз
child.__proto__.__proto__.__proto__.__proto__.__proto__ === null // true
- Функция Fn отношения наследования в предположении, что число наследования равно n
получитьFn.prototype.__proto__[3+n-1]
Ребенок должен быть 4 раза__proto__
```js
Child.prototype.__proto__.__proto__.__proto__.__proto__ === null // true
```
Конечно, давайте взглянем на отношения выше.
вне текста, класс
Следующий код также соблюдает правила, как и зачем, спросите себя.
class Grandpa {}
class Parent extends Grandpa{}
class Child extends Parent{};
var child = new Child()
О числе, логическом значении, строке, функции, дате, массиве, регулярном выражении и т. д.__proto__
а такжеprototype.__proto__
__proto__
Поскольку это функции, созданные Function,__proto__
Когда он находится в функции, это означает прототип конструктора, поэтому.__proto__ === .constrcutor.prototype === Function.prototype
.prototype.__proto__
Эти старые кости не следуют__proto__
= прототип конструктора Это правило
упомянутый выше,Function.prototype.__proto__ === Object.prototype
,
类推,这些内置的老骨头的.prototype.__proto__ === Object.prototype
Суммировать
-
Object.prototype.__proto__ === null
-
Function.prototype.__proto__ === Object.prototype
Встроенный номер, логическое значение, строка, функция, дата, массив, регулярное выражение и т. д. -
Object.__proto__ === Function.prototype === Function.__proto__
-
Math, JSON的__ptoto__是 Object.prototype
-
function A(){}
Отношение прототипа по умолчанию выглядит следующим образом
A.prototype.__proto__ === Object.prototype
-
Для функций с отношением наследования см. приведенный выше вывод.
-
Объектные литералы и новый объект () E.g. var a = {}, b = новый объект (), c = [];
a.__proto__ === a.constructor.prototype === Object.protype
a.__proto__.__proto__ === Object.protype.__proto__ === null
дважды
.__proto__
нулевой -
Базовые типы данных строка, число, логическое значение, например, var a = '', b=10, c= false,
b.__proto__ === b.constructor.prototype === Number.prototype
b.__proto__.__proto__ === Number.prototype.__proto__ === Object.prototype
b.__proto__.__proto__.__proto__ === Object.prototype.__proto__ === null
три раза
.__proto__
нулевой -
null и undefined не
__proto__
наконец
- посмотрите на картинку
- ввод в браузере
xx.__proto__
Или посмотрите xx.prototype сами