在JavaScript中似乎有类似函数的几个不同的“组”。以下是我的名字:
“常规函数”:这些函数可以使用parens和new
调用。大多数功能属于这一类。
“仅构造函数”:这些函数只能使用new
调用。例如,Image
,DOMParser
等
“非构造函数”:这些函数可以使用parens调用,但不能使用new
调用。例如,Math.round
,Function.prototype
。
“不可调用的函数”:这些函数根本不可调用。例如,window.constructor
,Document
,NodeList
等
这些不同功能组的专有名称是什么?
我还试图弄清楚函数所在的“组”是否可以根据其[[Prototype]]
(__proto__
)属性是否设置为Function.prototype
来确定。 / p>
大多数“常规功能”都有Function.prototype
,但可以使用非标准__proto__
删除。
大多数“仅构造函数”都有Object.prototype
。我找不到他们有Function.prototype
的任何情况(所以,没有call
或apply
)。这总是这种情况/规范行为吗?
“非构造函数”似乎主要有Function.prototype
,但Function.prototype
本身除外。还有其他案例有Object.prototype
吗?
“不可调用函数”似乎总是Object.prototype
。是这样的吗?
我会在这里回答一些答案:
常规功能:
function
构造函数:constructor
非构造函数:method
不可赎回:interface
这不是我真正想要的。 “函数”和“构造函数”当然是正确的,但我正在寻找更具体的东西(“非构造函数”等)。
“方法”并不比“功能”更好,因为它告诉您无法使用new
进行调用,constructor
无法明确指出它只能 < / em>使用new
进行调用。
在许多情况下,只能从宿主对象的constructor
属性访问不可调用的函数。我认为大多数更准确地称为“构造函数”而不是“接口”。
[关于主机对象与本机对象的东西]
这有点走上正轨。考虑到this question(以及接受的答案及其评论),对用户定义的函数是主机还是本机对象似乎存在一些分歧或混淆。
为避免这种情况,我们只需调用用户定义的函数UDF,而不用担心它们是主机还是本机。所以我们有UDF,宿主对象和本机对象。
“常规功能”
每个UDF
Object
,String
等原生对象
主机对象,例如window.toString
(在Chrome 18中测试)。
“仅构造函数”
没有原生对象?
托管对象,例如DOMParser
,Image
。
“非构造函数”
Math.round
和Function.prototype
等原生对象。
主持DOMParser#parseFromString
。
“不可调用的函数”
没有原生对象?
托管对象,例如NodeList
,DocumentFragment
。
所以看起来主机对象和仅构造函数/不可调用函数之间可能存在连接,但host vs native似乎不适用于非构造函数和常规函数。
答案 0 :(得分:1)
我认为你在这里所看到的是EcmaScript内置的本机对象与主机对象之间的细微差别,这些对象是开发人员创建和提供的对象。
“常规函数”映射到主机对象,也就是说使用JS和“仅构造函数”创建的函数,非构造函数“和”不可调用函数“映射到内置于语言中的本机对象较低的水平。
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
答案 1 :(得分:0)
我认为没有正式命名你所要求的,但通常这就是人们用任何编程语言调用所有这些函数的方式:
function
constructor
method
interface
(在JS的情况下,这是指较低级别的本机对象)