【发布时间】:2012-05-15 16:22:49
【问题描述】:
在 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 属性访问。我认为大多数将更准确地称为“构造函数”而不是“接口”。
[关于宿主对象与本机对象的内容]
这是在正确的轨道上。考虑到this question(以及公认的答案及其 cmets),对于用户定义的函数是宿主对象还是原生对象似乎存在一些分歧或混淆。
为避免这种情况,我们只调用用户定义函数 UDF,而不用担心它们是宿主函数还是本地函数。所以我们有 UDF、宿主对象和原生对象。
-
“常规函数”
每个 UDF
像
Object、String等原生对象像
window.toString这样的主机对象(在 Chrome 18 中测试)。
-
“仅构造函数”
没有原生对象?
托管对象,如
DOMParser、Image。
-
“非构造函数”
像
Math.round和Function.prototype这样的原生对象。像
DOMParser#parseFromString这样的宿主对象。
-
“不可调用的函数”
没有原生对象?
托管对象,如
NodeList、DocumentFragment。
所以看起来主机对象和仅构造函数/不可调用函数之间可能存在联系,但主机与本机似乎不适用于非构造函数和常规函数。
【问题讨论】:
-
您和您的术语再次出现问题! :)
-
呵呵,这回困扰了我好几天。我想知道我是否只是在编造没有的人为类别,但我想称之为something。
-
Here 是面向对象 JavaScript 的一个很好的介绍,应该可以回答您的问题。
-
@sp00m 它根本不回答。我想这个问题很混乱,我会想办法改写它。
标签: javascript function constructor terminology