2

Я столкнулся с following diagram, который выглядит довольно грязно.Дизайн: почему у JavaScript есть отдельные объекты Function и Object, и почему у них есть свои собственные объекты-прототипы?

Так вот идет мой вопрос:

Почему JavaScipt имеет отдельные функции и объект функция объекты (вместо того, чтобы, например, просто имея все, определенное на верхнем уровне точка пользователя к одному прототипу объекта Root, и с прототипом Root, указывающим на Root, который выглядит намного проще и более интуитивно понятным дизайном)?

Спасибо.


Извините за мое недоразумение. Теперь я понимаю:

  • У JavaScript есть примитивные типы данных и объекты. Примитивные типы данных: boolean, number, string, null и undefined. Когда это необходимо, первые три из рассматриваются как экземпляры Boolean, Number и String. Everything else - объект, включающий функции, массивы, регулярные выражения и даты . Функции могут использоваться как конструкторы или как обычные функции. Когда функция используется как конструктор, ее можно использовать для создания экземпляров объекта с помощью нового оператора. Прототип экземпляра экземпляра (доступ к которому осуществляется через свойство __proto__) устанавливается при создании экземпляра экземпляра объекта «prototype». Члены __proto__ используются для разрешения свойств через прототипную цепочку наследования.

    Поскольку функции являются более специализированными, чем объекты есть Function.prototype объект застрял в прототипе наследования цепи между функциями и объектом Object.prototype верхнего уровня. Функциональные и объектные конструкторы сами функции обычно не нужны, так как мы можем напрямую использовать ключевое слово функции и литералы объектов.

+3

Поскольку экземпляры функций отличаются от экземпляров объектов. Это функции. – Pointy

+0

Потому что объекты не должны быть исполняемыми по своей природе. –

+1

Но я понимаю, что в JavaScript все - это объект и функция в одно и то же время. См. Это сообщение: http://markdalgleish.com/2012/10/a-touch-of-class-inheritance-in-javascript/ –

ответ

2

Функция-конструктор может иметь только один прототип (в любой момент времени). Когда объект сконструирован, он становится связанным с объектом-прототипом, на который ссылается его конструктор. Объекты функций (и объекты String и объекты Date и т. Д.) Имеют прототипы с различными наборами свойств. Все объекты имеют прототипные цепи, которые в конечном итоге возвращаются к прототипу объекта.

Корпус с экземплярами функций еще более разный: построенные объекты являются функциями. Конструктор Function (который является частью собственной среды выполнения) дает встроенные свойства встроенного объекта, которые позволяют во время выполнения получить доступ к блоку кода, связанному с функциями.В частности (это все из section 13.2 of the spec:

  • [[Call]] внутреннее свойство устанавливается равным значению разобранного тела функции (код функции)
  • Внутреннее свойство [[Construct]] является также множество функции тела (и именно поэтому все функции могут быть использованы в качестве конструкторов)
  • внутреннего свойства [[HasInstance]] делается для обозначения внутреннего кода, который реализует section 15.3.5.3, что делает instanceOf работу

и аналогичные внутренние свойства [[Code]], [[FormalParameters]], [[Scope]] и другие. Другими словами, объект функции iternally особенный во многих отношениях. Однако в отношении к прототипу Function это не особо особенное. Профит функции сопровождается во время процесса поиска свойств на самом объекте функции. Например, при разрешении выражения, подобного этому:

var bound = function() { alert(this); }.bind("hello"); 

В процессе выполнения должно быть установлено свойство «bind». Он не будет найден на самом объекте функции, но он будет находится на прототипе.

+0

Что вы понимаете под конструкторской функцией? На самом деле не каждая функция одновременно является конструктором в JavaScript? Не являются ли функции и объекты одинаковыми в JavaScript. Итак, если они одинаковые, то почему у них есть функция и объект? Извините, если я что-то не понял. –

+1

@JohnSonderson да, это правда - любая функция может быть конструктором. Моя точка зрения заключалась в том, что объект имеет только один конструктор, а значение свойства «prototype» этого объекта функции определяет цепочку прототипов для нового объекта. – Pointy

+1

@JohnSonderson (ну, есть также 'Object.create()', но все равно, что объект получает только один выстрел, связанный с прототипом объекта). – Pointy

Смежные вопросы