不同类型功能的术语
Posted
技术标签:
【中文标题】不同类型功能的术语【英文标题】:Terminology for different types of functions 【发布时间】: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 它根本不回答。我想这个问题很混乱,我会想办法改写它。 【参考方案1】:我认为您的要求没有官方命名,但通常这是人们在任何编程语言中调用所有这些函数的方式:
常规函数:function
构造函数:constructor
非构造函数:method
不可调用:interface
(对于 JS,这是指较低级别的原生对象)
【讨论】:
【参考方案2】:我认为您在这里了解到的是 EcmaScript 中内置的本机对象和宿主对象(由开发人员创建和提供的对象)之间的细微差别。
“常规函数”映射到宿主对象,即使用 JS 创建的函数和“仅构造函数”、“非构造函数”和“不可调用函数”映射到语言中内置的本机对象较低的级别。
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
【讨论】:
以上是关于不同类型功能的术语的主要内容,如果未能解决你的问题,请参考以下文章