30.06.2014, 22:32
|
Профессор
|
|
Регистрация: 17.05.2014
Сообщений: 197
|
|
Что первично Object или {}?
Я короче, запутался, вначале тема была о другом, и заголовок тоже. Я мальца запутался в сабже, отредактировал все, и название темы и содержание.
Последний раз редактировалось foo, 30.06.2014 в 22:59.
|
|
30.06.2014, 22:38
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Всё логично.
{} - это литеральная форма создания нового объекта, т.е. можно записать так:
new Object()
У этого инстанса установлен прототипом объект из Object.prototype, т.е.
Object.prototype == {}.__proto__ // true
Чтобы не было путаницы в голове, то следует усвоить, что у функций есть свойство prototype, которое декларирует ссылку на объект, который будет установлен как прототип для нового объекта, который будет создан через new функцияКонструктор.
***
Object.__proto__! = {}
Потому что Object - это функция и
Object.__proto__ == Function.prototype
Последний раз редактировалось kobezzza, 30.06.2014 в 22:42.
|
|
30.06.2014, 22:41
|
Профессор
|
|
Регистрация: 17.05.2014
Сообщений: 197
|
|
Черт, я вовсем запутался.
|
|
30.06.2014, 22:43
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от foo
|
kobezzza,
Я извиняюсь, поспешил, ошибся в заголовке. Имел в виду не prototype, a __proto__
|
Увидел, обновил свой пост.
Цитата:
|
Object.__proto__! = {}
Потому что Object - это функция и
Object.__proto__ == Function.prototype
|
|
|
30.06.2014, 22:45
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от foo
|
Черт, я вовсем запутался.
|
Почитай цикл статей Димы Сошникова, у него там очень понятно всё описано.
Касательной конструкторов, то
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
Последний раз редактировалось kobezzza, 30.06.2014 в 22:54.
|
|
30.06.2014, 22:55
|
Профессор
|
|
Регистрация: 17.05.2014
Сообщений: 197
|
|
kobezzza,
Короче, тысячу извинений, я уже дважды обновил. В голове крутиться вопрос, а сформулировать не могу нормально. В общем, из Вашего ответа я сделал следующие выводы. Object -- это функция, возвращающая пустой объект. Когда мы пишем литеральную форму, это сахар для вызова Object так получается? То есть, под капотом у нас обрабатывает все та же Object? Она первична?
|
|
30.06.2014, 23:11
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Цитата:
|
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;
|
|
30.06.2014, 23:15
|
Профессор
|
|
Регистрация: 17.05.2014
Сообщений: 197
|
|
kobezzza,
Огромное спасибо за ответы
|
|
|
|