Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Object.prototype!={}? (https://javascript.ru/forum/misc/48358-object-prototype-%3D%7B%7D.html)

foo 30.06.2014 22:32

Что первично Object или {}?
 
Я короче, запутался, вначале тема была о другом, и заголовок тоже. Я мальца запутался в сабже, отредактировал все, и название темы и содержание.

kobezzza 30.06.2014 22:38

Всё логично.

{} - это литеральная форма создания нового объекта, т.е. можно записать так:

new Object()


У этого инстанса установлен прототипом объект из Object.prototype, т.е.

Object.prototype == {}.__proto__ // true


Чтобы не было путаницы в голове, то следует усвоить, что у функций есть свойство prototype, которое декларирует ссылку на объект, который будет установлен как прототип для нового объекта, который будет создан через new функцияКонструктор.

***

Object.__proto__! = {}

Потому что Object - это функция и

Object.__proto__ == Function.prototype

foo 30.06.2014 22:41

Черт, я вовсем запутался.

kobezzza 30.06.2014 22:43

Цитата:

Сообщение от foo (Сообщение 318866)
kobezzza,
Я извиняюсь, поспешил, ошибся в заголовке. Имел в виду не prototype, a __proto__

Увидел, обновил свой пост.

Цитата:

Object.__proto__! = {}

Потому что Object - это функция и

Object.__proto__ == Function.prototype

kobezzza 30.06.2014 22:45

Цитата:

Сообщение от foo (Сообщение 318866)
Черт, я вовсем запутался.

Почитай цикл статей Димы Сошникова, у него там очень понятно всё описано.

Касательной конструкторов, то

http://dmitrysoshnikov.com/ecmascrip...e/#konstruktor

***

Если описывать кратко, то функции в JS - это тоже объекты, но логично, что у них есть свои отличительные особенности, например служебный метод [[call]] и т.д. поэтому прототип функции легко представить как:

Function.prototype = {
    __proto__: Object.prototype,

   call: ..., // не путать с [[call]]
   apply: ...,
   bind: ...,

   [[call]]: ...,
   [[constructor]]: ...
 
   и т.д.
}

Function.prototype.__proto__ === Object.prototype // true

foo 30.06.2014 22:55

kobezzza,
Короче, тысячу извинений, я уже дважды обновил. В голове крутиться вопрос, а сформулировать не могу нормально. В общем, из Вашего ответа я сделал следующие выводы. Object -- это функция, возвращающая пустой объект. Когда мы пишем литеральную форму, это сахар для вызова Object так получается? То есть, под капотом у нас обрабатывает все та же Object? Она первична?

kobezzza 30.06.2014 23:11

Цитата:

Object -- это функция, возвращающая пустой объект
Любая функция в JS может создавать пустой объект при вызове через new и ставить ему прототип, который указан в свойстве prototype функции, т.е. когда мы пишем

{} // это тоже самое, что и
new Object // и этому новому объекту будет установлен Object.prototype


Если вызывать функцию без new, то её поведение отлично, но если брать в расчёт именно Object, то тогда он будет выступать в роли фабрики объектов, т.е.

Object(1) // -> new Number(1)
Object('foo') // -> new String('foo')


Цитата:

Когда мы пишем литеральную форму, это сахар для вызова Object так получается?
Да, только важно, что для new Object.

Цитата:

Она первична?
Все встроенные конструкторы, такие как Function, String, Array, Object и т.д. являются встроенными объектами и реализуются самой VM JavaScript и по умолчанию функция Object и его прототип (нативный объект Object.prototype) являются самыми корневыми элементами языка, т.е.

new Date().__proto.__ == Date.prototype;
Date.prototype.__proto__ == Object.prototype;
Date.prototype.__proto__.constructor == Object;

foo 30.06.2014 23:15

kobezzza,
Огромное спасибо за ответы:)


Часовой пояс GMT +3, время: 23:27.