По-видимому, существует несколько разных "групп" функций -, подобных вещам в JavaScript. Вот мои придуманные -имена для них:
"Обычные функции" :Их можно вызывать со скобками и с new
. Большинство функций относятся к этой категории.
"Конструктор -работает только" :Их можно вызывать только с помощью new
. Например, Image
, DOMParser
и т. д.
"Функции, не являющиеся конструкторами -" :Их можно вызывать со скобками, но нельзя с new
. Например, Math.round
, Function.prototype
.
«Не -вызываемые функции» :Эти функции вообще нельзя вызывать. Например, window.constructor
, Document
, NodeList
и т. д.
Каковы собственные имена этих различных групп функций?
Я также пытаюсь выяснить, можно ли определить, в какой «группе» находится функция, основываясь на том, установлено ли для ее свойства[[Prototype]]
(__proto__
)значение Function.prototype
.
Большинство «обычных функций» будут иметь Function.prototype
, но их можно удалить с помощью нестандартного -__proto__
.
Большинство "конструкторов -только функции" имеют Object.prototype
. Я не могу найти ни одного случая, когда у них есть Function.prototype
(, поэтому нет call
илиapply
). Всегда ли это так / заданное поведение?
«Не -функции-конструкторы», по-видимому, в основном имеют Function.prototype
, за исключением самого Function.prototype
. Есть ли другие случаи, которые имеют Object.prototype
?
"Не -вызываемые функции" всегда имеют Object.prototype
. Так ли это?
Я отвечу на некоторые ответы здесь:
Обычная функция:
function
Конструктор:constructor
Не -конструктор:method
Не -вызываемый:interface
Это не совсем то, что я ищу. «функция» и «конструктор», конечно, в общем правильны, но я ищу что-то более конкретное («не -функция-конструктор» и т. д. ).
"метод" ничем не лучше "функции" в том, что говорит вам, что его нельзя вызвать с помощью new
, а constructor
не передает того, что его можно вызывать только с new
.
Во многих случаях не -вызываемые функции доступны только из свойства constructor
ведущего объекта. Я думаю большинство из них правильнее было бы назвать «конструкторами», а не «интерфейсами».
[Материал о хост-объектах и нативных объектах]
Это вроде как на правильном пути. Принимая во внимание этот вопрос(и принятый ответ, а также его комментарии ), кажется, что существуют некоторые разногласия или путаница в отношении того, являются ли определяемые пользователем -функции хост-объектами или собственными объектами.
Чтобы избежать этого, давайте просто вызовем определяемые пользователем -функции UDF и не будем беспокоиться о том, являются ли они хостовыми или собственными. Итак, у нас есть пользовательские функции, хост-объекты и нативные объекты.
«Обычные функции»
Каждая пользовательская функция
Собственные объекты, такие как Object
, String
и т. д.
Хост-объекты, такие как window.toString
(, протестированы в Chrome 18 ).
"Конструктор -работает только"
Нет нативных объектов?
Хост-объекты, такие как DOMParser
, Image
.
"Не -функции-конструкторы"
Собственные объекты, такие как Math.round
и Function.prototype
.
Хост-объекты типа DOMParser#parseFromString
.
«Не -вызываемые функции»
Нет собственных объектов?
Хост-объекты, такие как NodeList
, DocumentFragment
.
Таким образом, похоже, что может быть связь между хост-объектами и конструктором -только/не -вызываемыми функциями, но host vs native, похоже, не применяется к не -конструктору и обычным функциям.