Основной источник идей для этой статьиРождение всего в мире 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
машина, производящая машину
Ну а теперь мир фабрики обогатился, разные машины создают разные предметы, все довольны друг другом, через некоторое время у внешнего мира есть спрос, не хочу такой предмет, ты создаешь другой для я Ну, фабрика подумала, если бы она делала это каждый раз, не будет ли это утомительно, поэтому она создала супермощную вещь, машину, которая создала машину, как мы ее называем.Function
, поскольку он используется для создания машины, его объект-шаблон является элементом Tianzi № 2, но он снова является машиной, поэтому экземпляр объекта Tianzi № 2
который
Function.__proto__ === Function.prototype
Это тожеJavaScript
самый известныйкурица и яйцоЭта проблема
Вот проблема
Хорошо, теперь весьJavaScript
Мир нормальный, но есть еще несколько вопросов в процессе создания, оставьте себе подумать не спеша
- Элемент Tianzi №1
Object.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
Справочная статья