Порядок вещей в JavaScript

внешний интерфейс JavaScript V8

Основной источник идей для этой статьиРождение всего в мире JavaScript, и, наконец, в сочетании с некоторым пониманием, чтобы разобраться с некоторыми из более классических проблем в Интернете, и я обязательно приведу эти ссылки в следующую статью.

Возможно, мы слышали поговорку во многих местах -JavaScriptВсе является объектом. Хотя это утверждение не особенно точно, поскольку мы знаемundefinedне является объектом, но бесспорно, чтоJavaScriptБольшинство данных являются объектами, поэтому возникает вопрос, в каком порядке генерируются объекты? дляObject, этоFunctionэкземпляр, потому чтоObject instanceof Function // true;дляFunctionскажем, этоObjectэкземпляр, потому чтоFunction instanceof Object // true, так что это на первом местеObjectили сначалаFunctionШерстяная ткань? Эта статья в основном знакомитJavaScriptпроцесс создания объекта

Начальный хаос

мы можем поставитьJavaScriptПоскольку завод мира является самодостаточным, это растение можно понимать как наш двигатель V8, изначально растения ничего, кроме фабрики, не думают, что что-то сама, что да, такnullВозникновение

万物之始
Фабрика хочет создать какие-то предметы (то есть объекты), но сейчас нет предмета (материала шаблона) для создания, поэтому фабрика основана наnullсоздать шаблон
Этот объект потрясающий, даJavaScriptПредок объекта в , все объекты найдут этот объект после возврата к источнику, этот элемент Tianzi № 1JavaScriptсерединаObject.prototype, Таким образом, вJavaScriptсерединаObject.prototype.__proto__ === null

машина, которая делает предметы

Ну, раз шаблон уже существует, не было бы неплохо вручную создавать фабрики одну за другой на его основе? Но такая фабрика слишком неэффективна, поэтому фабрика придумала и создала машину для создания предметов (предметов), а шаблоны этих предметов - упомянутый выше элемент Tianzi №1Object.prototype

Теперь мы можем непрерывно создавать предметы на основе этой машины, и ее шаблонObject.prototype

мы проходимnew ObjectСоздайте объект, так как он создан на основе элемента Tianzi № 1, поэтомуnew Object({}).__proto__ === Object.prototype

машины, которые делают разные предметы

Сейчас фабрика может создавать много этих изделий, но это слишком однообразно для фабрики, а у фабрики вдруг возникает идея, мы можем создавать больше машин (т.е.JavaScriptсерединаArray,Stringд.) для создания различных объектов, но для машины это тоже объект.Сейчас, когда машин так много, необходимо отличать такие объекты-машины от конкретных объектов-объектов, которые я создал. , поэтому фабрика создает Tianzi Элемент №2 на основе элемента Tianzi №1

Этот элемент Tianzi №2 является шаблонным объектом машины, то есть каждая машина является ее экземпляром

машина, производящая машину

Ну а теперь мир фабрики обогатился, разные машины создают разные предметы, все довольны друг другом, через некоторое время у внешнего мира есть спрос, не хочу такой предмет, ты создаешь другой для я Ну, фабрика подумала, если бы она делала это каждый раз, не будет ли это утомительно, поэтому она создала супермощную вещь, машину, которая создала машину, как мы ее называем.Function, поскольку он используется для создания машины, его объект-шаблон является элементом Tianzi № 2, но он снова является машиной, поэтому экземпляр объекта Tianzi № 2 который

Function.__proto__ === Function.prototype

Это тожеJavaScriptсамый известныйкурица и яйцоЭта проблема

Вот проблема

Хорошо, теперь весьJavaScriptМир нормальный, но есть еще несколько вопросов в процессе создания, оставьте себе подумать не спеша

  • Элемент Tianzi №1Object.prototypeкак это прошлоnullсоздал это
  • Function.__proto__ === Function.prototype; Functionконструкторprototypeсвойства и__proto__все свойства указывают на один и тот же прототип, можно ли сказатьFunctionобъект сделанFunctionЭкземпляр, созданный конструктором

классические картинки

Эта картинка помогает понятьFunctionа такжеObjectОтношения, следующие объясняют некоторые объяснения каждой строки, нарисовав картинку самостоятельно.

  • Красная линия:new Object()Объект шаблонаObject.prototype,ObjectОбъект-прототипObject.prototype, его объект шаблонаFunction.prototype,Object.prototypeОбъект шаблонаnull
new Object().__proto__ === Object.prototype;
Object.__proto__ === Function.prototype;
Object.prototype.__proto__ === nulll;
  • Желтая линия:FunctionОбъект прототипа и объект шаблона обаFunction.prototype,Function.prototypeОбъект шаблонаObject.prototype
Function.prototype === Function.__proto__;
Function.prototype.__proto__ === Object.prototype;
  • черная линия:new Foo()Объект шаблонаFoo.prototype,Foo.prototypeОбъект шаблонаObject.prototype,FooОбъект шаблонаFunction.prototype
new Foo().__proto__ === Foo.prototype;
Foo.prototype.__proto__ === Object.prototype;
Foo.__proto__ === Function.prototype

Справочная статья