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,而不用担心它们是宿主函数还是本地函数。所以我们有UDF、宿主对象和本机对象。
“常规功能”
每个 UDF
本机对象,如
Object
,String
等。托管对象,例如
window.toString
(在 Chrome 18 中测试)。
“仅构造函数”
没有原生对象?
宿主对象,如
DOMParser
,Image
。
“非构造函数”
本机对象,如
Math.round
和Function.prototype
。托管对象,如
DOMParser#parseFromString
.
“不可调用的函数”
没有原生对象?
宿主对象,如
NodeList
,DocumentFragment
。
所以看起来主机对象和仅构造函数/不可调用函数之间可能存在联系,但主机与本机似乎并不适用于非构造函数和常规函数。