Почему серия: A.__proto__.__proto__.__proto__ === null

внешний интерфейс JavaScript
Почему серия: A.__proto__.__proto__.__proto__ === null

предисловие

Давным-давно, когда он был еще относительно белым, коллега такой-то, код ниже покажите мне

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

несколько правил

Давайте сначала не будем об этом беспокоиться, давайте посмотрим на картинку выше, мы должны сначала знать или помнить эти правила.

  1. Object.prototype.__proto__ === null
  2. Object.__proto__ === Function.prototype


То естьObject.__proto__ === Function.prototype === Function.__proto__

Object.constructor.prototype  === Function.prototype  
// true
Function.constructor === Function
// true
  1. 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()
  1. A.__proto__

Конструктор — это функция
A.constructor === Function
A.__proto__ === Function.prototype

  1. A.__proto__.__proto__

A.__proto__.__proto__ === Function.prototype.__proto__
в соответствии сFunction.prototype.__proto__ === Object.prototype
A.__proto__.__proto__ === Function.prototype.__proto__ === Object.prototype

  1. 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__

  1. a.__proto__

Конструктор a - это A
a.constructor === A
a.__proto__ === a.constructor.prototype
a.__proto__ === A.prototype

  1. a.__proto__.__proto__

a.__proto__.__proto__ === A.prototype.__proto__
Согласно правилу 3, снова обращаясь к рисунку,Foo.prototype.__proto__ === Object.prototype
a.__proto__.__proto__ === A.prototype.__proto__ === Object.protype

  1. 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__

  1. Child.prototype.__proto__

Child.prototype.__proto__ === Child.prototype.constructor.prototype
Прототипом Child.prototype является экземпляр Parent, а конструктором прототипа Child является Parent, поэтому
Child.prototype.__proto__ === Parent.prototype

  1. Child.prototype.__proto__.__proto__

Child.prototype.__proto__.__proto__ === Parent.prototype.__proto__
Ссылаясь на схему,Foo.prototype.__proto__ === Object.prototype
Child.prototype.__proto__.__proto__ === Object.prototype

  1. Child.prototype.__proto__.__proto__

Child.prototype.__proto__.__proto__ .__proto__=== Object.prototype.__proto__ === null

child.__proto__.__proto__.__proto__ .__proto__

посмотри сноваchild.__proto__.__proto__.__proto__ .__proto__

  1. child.__proto__

child.__proto__ === Child.prototype

  1. child.__proto__.__proto__

child.__proto__.__proto__ === Child.prototype._proto__ === Child.prototype.constructor.prototype === Parent.prototype

  1. 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

  1. 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__, скажете вы, нет вам конца,
Дальше не буду анализировать, выведу формулу:

Производная формула

  1. Любая пользовательская функция, по умолчанию, три раза.__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
  1. Функция Fn отношения наследования, если число наследования равно n,fn = new Fn();

Такfn.__proto__[3 + n] === null
ребенок должен быть 3+2 это 5 раз

    child.__proto__.__proto__.__proto__.__proto__.__proto__ === null // true
  1. Функция 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__

  1. __proto__

Поскольку это функции, созданные Function,__proto__Когда он находится в функции, это означает прототип конструктора, поэтому.__proto__ === .constrcutor.prototype === Function.prototype

  1. .prototype.__proto__

Эти старые кости не следуют__proto__= прототип конструктора Это правило
упомянутый выше,Function.prototype.__proto__ === Object.prototype, 类推,这些内置的老骨头的.prototype.__proto__ === Object.prototype

Суммировать

  1. Object.prototype.__proto__ === null

  2. Function.prototype.__proto__ === Object.prototype
    Встроенный номер, логическое значение, строка, функция, дата, массив, регулярное выражение и т. д.

  3. Object.__proto__ === Function.prototype === Function.__proto__

  4. Math, JSON的__ptoto__是 Object.prototype

  5. function A(){}Отношение прототипа по умолчанию выглядит следующим образом

A.prototype.__proto__ === Object.prototype

  1. Для функций с отношением наследования см. приведенный выше вывод.

  2. Объектные литералы и новый объект () E.g. var a = {}, b = новый объект (), c = [];
    a.__proto__ === a.constructor.prototype === Object.protype
    a.__proto__.__proto__ === Object.protype.__proto__ === null

    дважды.__proto__ нулевой

  3. Базовые типы данных строка, число, логическое значение, например, 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__ нулевой

  4. null и undefined не__proto__

наконец

  1. посмотрите на картинку
  2. ввод в браузереxx.__proto__Или посмотрите xx.prototype сами