【问题标题】:Are Array, Object, Map built-in constructor functions or classes?Array、Object、Map是内置构造函数还是类?
【发布时间】:2023-02-06 01:12:57
【问题描述】:

我知道我的问题可能会被否决并关闭,但我对这个问题真的很困惑。

在某些地方,他们说Array、Date和Object是内置类。但是,我发现它们都可以在没有 new 的情况下被调用,这在类中是不可能的。

即使 Map、Set 等...如果没有 new 也无法调用。在尝试获取它们的定义时,所有这些都会显示类似 function ItsName() { [native code] } 的内容,而我认为一个类应该显示类似 class ItsName { [native code] } 的内容。

请不要在没有至少将我指向某个地方的情况下关闭问题,我可能会得到解释。

【问题讨论】:

  • JavaScript 已经发展了很长时间。 Map 和 Set 是很多比 Array 和 Date 更新。
  • 所以因为 Array 和 Object 比较旧,所以可以不用 new 来调用,而 Map 和 Set 不能不用 new 来调用,因为不叫它们 new 是不尊重的。
  • 好吧,它比那复杂一点。在没有new 的情况下调用时,较旧的构造函数具有不同的语义,虽然它可能有点不雅,但很有意义。如果没有new,Map() 会有什么样的行为尚不清楚。另请注意,Symbol 表示一类项目,但它不能被调用new。最后,这些都是标准委员会决定的事情,我们对此无能为力。
  • 请注意,您可以编写自己的函数以使其坚持使用new 调用。

标签: javascript function class constructor built-in


【解决方案1】:

Object、Array等对象最具体的描述是“内置构造函数”。

规范的"4.4.12 built-in object"部分注释:

4.4.12 内置对象
由 ECMAScript 实现指定和提供的对象

笔记
标准内置对象在本规范中定义。 ECMAScript 实现可以指定和提供其他类型的 内置对象。 A内置构造函数是一个内置对象,它是 也是一个构造函数。


以下是规范中其他有趣术语和定义的简短摘要:

  • 一个目的是 Object 类型的成员。 (见4.4.6)
  • 一个功能(或者函数对象) 是一个目的支持内部功能[[Call]](可能公开也可能不公开)。 (见6.1.7.2 Table 5)
  • 一个构造器(或者构造函数或者构造函数对象) 是一个功能支持内部函数 [[Construct]](通常使用 new 运算符调用)。 (见6.1.7.2 Table 5)
  • 全部建设者拥有财产prototype。 (见4.3.1)
  • 两者都有函数定义和函数表达式创建构造函数。 (分别参见15.2.4和15.2.5)
  • 箭头函数表达式不要创建构造函数,因此不能实例化。 (见15.3.4)
  • 类定义(ES6 class 语法)返回不可调用的构造函数(不公开 [[Call]])。 (见15.7.14)

【讨论】:

  • 从技术上讲,注释是非规范的,但我确信它们的内容至少在规范的某个地方被部分提及。我只是现在没有时间去寻找它们。
猜你喜欢
  • 1970-01-01
  • 2014-02-05
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多