Сообщение от Plest
|
По Вашим замечаниям мне осталось поправить части статьи о следующих вещах:
функциональный аргумент,
|
Функциональный аргумент - это термин используемый в функциональных языках и означающий, что аргументом некой функции, является так же - функция. Функция, принимающая функциональный аргумент, называется
функционалом (в математике -
оператор).
Функции же, возвращающие другие функции, называются
функции с функциональным значением.
Я
затрагивал эти определения в статье о замыканиях в ES.
Функциональный аргумент (сокращённо, "Фурарг", "Funarg") - это одна из "проблем" стековой организации локальных переменных. Решением этой проблемы и являются замыкания, которые запоминают весь лексический контекст ещё на этапе создания. Соответственно, локальные переменные хранятся уже не в стеке, а в "куче" (heap).
C другой стороны, коллбэк (callback) - тоже подходит под определение и не завязан на чисто функциональные языки. Например, в Си, это просто указательно на функцию, и, если область определения этой функции уже удалена, то коллбэк не отработает.
Поскольку в ES все функции являются замыканиями, то теоретически, термин функциональный аргумент подошёл бы больше. Хотя, и коллбэк - тоже вписывается.
Двояко, на самом деле. Возможно даже, функциональный аргумент - это частный случай коллбэка, а не наоборот, как я отмечал выше, но я, опять же, имел в виду относительно ES.
Поэтому можно оставить и коллбэк, сильной принципиальной разницы нет. К тому же, коллбэк, действительно, более привычное и распространённое понимание передачи кода параметров в функцию.
Сообщение от Plest
|
constructor
|
Свойство
constructor привилегированно лишь двумя моментами: (1) оно автоматом создаётся при создании объектов-функций и записывается в свойство функции
prototype и (2) свойство
constructor в этом случае получает
{DontEnum}, т.е. не выводится в
for...in.
За исключением того, что порождённые от функции-конструктора объекты, будут находить это свойство в своём прототипе (ведь оно было добавлено в
Функция.prototype при создании
Функции), ничего примечательного больше с этим свойством не связано. Его можно свободно удалить или изменить.
Т.е. основной момент, что свойство
constructor - это свойство прототипа объекта, но не родное свойство. Соответственно, утверждение, что все объекты при порождение получают свойство
constructor - неверное. Ни один из объектов не получает свойство
constructor при порождении (кроме как объекта, являющегося свойством prototype фунцкии), но объекты
наследуют это свойство из своего прототипа, поскольку прототип объектов - [[Prototype]] был установлен из свойства функции
prototype (или же из
Object.prototype, если на момент порождения
Функция.prototype не являлся объектом).
Сообщение от Plest
|
конструктор
|
Конструктор в ES - это любая функция; функция любого типа: будь то, декларация функции (Function Declaration), функция-выражение (Function Expression) или функция, созданная конструктором Function.
Если разобрать глубже, то код
самой функции является
инициализирующим, поскольку за создание объекта отвечает на сама функция, а её внутреннее свойство
[[Construct]].
[[Construct]] - это общий конструктор для всех объектов. Когда создаются функции, все они получают внутреннее свойство
[[Construct]].
Оператор
new, соответственно, вызывает метод
[[Construct]], который и создаёт объект. И уже затем, сам
[[Construct]], вызывает функцию в контексте вновь созданного объекта, т.е. делает что вроде:
Функция.apply(созданныйОбъек , arguments);.
Более подробно
о конструкторе - в седьмой части. Там же -
алгоритм создания объектов.
Также, можно посмотреть
алгоритм создания функций (из пятой части), чтобы точно понять, что из себя представляют функции.
Для Википедии, поскольку там должно быть описание не чисто теоретико-сухое и не чересчур углублённое, а -
для точного, но основного понимания, может быть следующим:
Конструктор в ES- это (любая) функция, являющаяся шаблоном для порождаемых объектов. Применённая к оператору
new, она создаёт объект и инициализирует его, будучи вызванной в контексте созданного объекта. За непосредственное выделение памяти и создание объекта, отвечает её внутренний метод [[Construct]], который является стандартным конструктором для всех объектов и записывается в каждую функцию при её создании. Не обязательно в таком виде, но с этой сутью.
Хотя, можно и срезать дебри про
[[Construct]] и вынести чуть ниже. Т.е. сделать основное описание, что - это функция, создающая и инициализирующая объект посредством this (у вас сейчас примерно так и написано). И написать, что подробное определение смотрите чуть ниже (кому интересно).