不同类型功能的术语

时间:2012-05-07 06:01:18

标签: javascript function constructor terminology

在JavaScript中似乎有类似函数的几个不同的“组”。以下是我的名字:

  • “常规函数”:这些函数可以使用parens和new调用。大多数功能属于这一类。

  • “仅构造函数”:这些函数只能使用new调用。例如,ImageDOMParser

  • “非构造函数”:这些函数可以使用parens调用,但不能使用new调用。例如,Math.roundFunction.prototype

  • “不可调用的函数”:这些函数根本不可调用。例如,window.constructorDocumentNodeList

这些不同功能组的专有名称是什么?


我还试图弄清楚函数所在的“组”是否可以根据其[[Prototype]]__proto__)属性是否设置为Function.prototype来确定。 / p>

  • 大多数“常规功能”都有Function.prototype,但可以使用非标准__proto__删除。

  • 大多数“仅构造函数”都有Object.prototype。我找不到他们有Function.prototype的任何情况(所以,没有callapply)。这总是这种情况/规范行为吗?

  • “非构造函数”似乎主要有Function.prototype,但Function.prototype本身除外。还有其他案例有Object.prototype吗?

  • “不可调用函数”似乎总是Object.prototype。是这样的吗?


我会在这里回答一些答案:

  

常规功能:function
  构造函数:constructor
  非构造函数:method
  不可赎回:interface

这不是我真正想要的。 “函数”和“构造函数”当然是正确的,但我正在寻找更具体的东西(“非构造函数”等)。

“方法”并不比“功能”更好,因为它告诉您无法使用new进行调用,constructor无法明确指出它只能 < / em>使用new进行调用。

在许多情况下,只能从宿主对象的constructor属性访问不可调用的函数。我认为大多数更准确地称为“构造函数”而不是“接口”。


  

[关于主机对象与本机对象的东西]

这有点走上正轨。考虑到this question(以及接受的答案及其评论),对用户定义的函数是主机还是本机对象似乎存在一些分歧或混淆。

为避免这种情况,我们只需调用用户定义的函数UDF,而不用担心它们是主机还是本机。所以我们有UDF,宿主对象和本机对象。

  • “常规功能”

    • 每个UDF

    • ObjectString等原生对象

    • 主机对象,例如window.toString(在Chrome 18中测试)。

  • “仅构造函数”

    • 没有原生对象?

    • 托管对象,例如DOMParserImage

  • “非构造函数”

    • Math.roundFunction.prototype等原生对象。

    • 主持DOMParser#parseFromString

    • 等对象
  • “不可调用的函数”

    • 没有原生对象?

    • 托管对象,例如NodeListDocumentFragment

所以看起来主机对象和仅构造函数/不可调用函数之间可能存在连接,但host vs native似乎不适用于非构造函数和常规函数。

2 个答案:

答案 0 :(得分:1)

我认为你在这里所看到的是EcmaScript内置的本机对象与主机对象之间的细微差别,这些对象是开发人员创建和提供的对象。

“常规函数”映射到主机对象,也就是说使用JS和“仅构造函数”创建的函数,非构造函数“和”不可调用函数“映射到内置于语言中的本机对象较低的水平。

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

答案 1 :(得分:0)

我认为没有正式命名你所要求的,但通常这就是人们用任何编程语言调用所有这些函数的方式:

  • 常规功能:function
  • 构造函数:constructor
  • 非构造函数:method
  • 不可调用:interface(在JS的情况下,这是指较低级别的本机对象)