Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.06.2014, 22:32
foo foo вне форума
Профессор
Отправить личное сообщение для foo Посмотреть профиль Найти все сообщения от foo
 
Регистрация: 17.05.2014
Сообщений: 197

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

Последний раз редактировалось foo, 30.06.2014 в 22:59.
Ответить с цитированием
  #2 (permalink)  
Старый 30.06.2014, 22:38
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Всё логично.

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

new Object()


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

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


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

***

Object.__proto__! = {}

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

Object.__proto__ == Function.prototype
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 30.06.2014 в 22:42.
Ответить с цитированием
  #3 (permalink)  
Старый 30.06.2014, 22:41
foo foo вне форума
Профессор
Отправить личное сообщение для foo Посмотреть профиль Найти все сообщения от foo
 
Регистрация: 17.05.2014
Сообщений: 197

Черт, я вовсем запутался.
Ответить с цитированием
  #4 (permalink)  
Старый 30.06.2014, 22:43
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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

Цитата:
Object.__proto__! = {}

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

Object.__proto__ == Function.prototype
__________________
kobezzza
code monkey
Ответить с цитированием
  #5 (permalink)  
Старый 30.06.2014, 22:45
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 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
code monkey

Последний раз редактировалось kobezzza, 30.06.2014 в 22:54.
Ответить с цитированием
  #6 (permalink)  
Старый 30.06.2014, 22:55
foo foo вне форума
Профессор
Отправить личное сообщение для foo Посмотреть профиль Найти все сообщения от foo
 
Регистрация: 17.05.2014
Сообщений: 197

kobezzza,
Короче, тысячу извинений, я уже дважды обновил. В голове крутиться вопрос, а сформулировать не могу нормально. В общем, из Вашего ответа я сделал следующие выводы. Object -- это функция, возвращающая пустой объект. Когда мы пишем литеральную форму, это сахар для вызова Object так получается? То есть, под капотом у нас обрабатывает все та же Object? Она первична?
Ответить с цитированием
  #7 (permalink)  
Старый 30.06.2014, 23:11
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 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;
__________________
kobezzza
code monkey
Ответить с цитированием
  #8 (permalink)  
Старый 30.06.2014, 23:15
foo foo вне форума
Профессор
Отправить личное сообщение для foo Посмотреть профиль Найти все сообщения от foo
 
Регистрация: 17.05.2014
Сообщений: 197

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск