7

JavaScript 中似乎有几个不同的“组”类似函数的东西。以下是我为他们编造的名字:

  • “常规函数”:可以使用括号和new. 大多数功能都属于这一类。

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

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

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

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


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

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

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

  • “非构造函数”似乎Function.prototype除了Function.prototype自身之外大多具有。还有其他情况Object.prototype吗?

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


我将在这里回复一些答案:

常规函数:function
构造函数:constructor
非构造函数:method
不可调用:interface

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

“方法”并不比“函数”更好地告诉你它不能用 调用newconstructor也没有明白它只能用 调用new

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


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

这是在正确的轨道上。考虑到这个问题(以及接受的答案及其评论),对于用户定义的函数是宿主对象还是本机对象似乎存在一些分歧或混淆。

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

  • “常规功能”

    • 每个 UDF

    • 本机对象,如Object,String等。

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

  • “仅构造函数”

    • 没有原生对象?

    • 宿主对象,如DOMParser, Image

  • “非构造函数”

    • 本机对象,如Math.roundFunction.prototype

    • 托管对象,如DOMParser#parseFromString.

  • “不可调用的函数”

    • 没有原生对象?

    • 宿主对象,如NodeList, DocumentFragment

所以看起来主机对象和仅构造函数/不可调用函数之间可能存在联系,但主机与本机似乎并不适用于非构造函数和常规函数。

4

2 回答 2

1

我认为您在这里了解的是 EcmaScript 内置的本机对象和宿主对象之间的细微差别,这些对象由开发人员创建和提供。

“常规函数”映射到宿主对象,即使用 JS 创建的函数和“仅构造函数”、“非构造函数”和“不可调用函数”映射到语言内置的较低级别的原生对象.

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

于 2012-05-07T21:10:17.243 回答
0

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

  • 常规功能:function
  • 构造函数:constructor
  • 非构造函数:method
  • Non-callable:(interface对于 JS,this 指的是较低级别的原生对象)
于 2012-05-07T21:10:03.100 回答