JavaScript:所有标准内置对象实际上都是构造函数吗?
我最近一直在潜心研究JavaScript,在花了几个月的时间之后,我仍然对一些内部内容感到困惑 具体地说,我是想把我的头绕在所谓的 我所知道的JavaScript:所有标准内置对象实际上都是构造函数吗?,javascript,Javascript,我最近一直在潜心研究JavaScript,在花了几个月的时间之后,我仍然对一些内部内容感到困惑 具体地说,我是想把我的头绕在所谓的 我所知道的 JavaScript中的所有函数,无论是内置的还是用户创建的,都是对象(函数对象) 常规对象和函数对象之间的区别在于函数对象实现了[[Call]]属性(因此可以被调用) 所有函数对象实现.prototype属性,该属性表示使用函数对象作为构造函数创建的所有对象的原型 问题 是否所有的标准内置对象实际上都是函数对象(即构造函数) 是否所有(且仅限于)功能对
函数对象
)常规对象
和函数对象
之间的区别在于函数对象
实现了[[Call]]
属性(因此可以被调用)函数对象
实现.prototype
属性,该属性表示使用函数对象
作为构造函数创建的所有对象的原型标准内置对象
实际上都是函数对象
(即构造函数)功能对象实现了.prototype
通用对象
还是功能对象
new
一起使用,则会引发异常(Symbol
)object.create()
.prototype
值的新对象原型链的自动设置仅适用于函数,但这有点重复,因为函数是唯一可以成为构造函数的东西
所有函数对象都实现.prototype
属性,该属性表示以函数对象作为构造函数创建的所有对象的原型
不,只有构造函数才能做到这一点。有些函数没有构造函数(即它们有[[call]]但没有[[construct]]内部方法),当您尝试将它们与new
一起使用时,它们会抛出一个错误(有些函数有[[construct]]内部方法,但仍然抛出)
从技术上讲,甚至构造函数也不一定需要.prototype
。您可以实现可以构造但没有.prototype
属性的内置项。然而,所有本机构造函数确实都有一个
所有标准内置对象都是功能对象吗
< >不考虑“代码>数学< /代码>,<代码> JSON<代码>,<代码> Atomics < /代码>或<代码>反映< /COD>内置对象。它们根本不是函数
函数对象(即构造函数)
不考虑“<代码> PARSETIN < /COD>”、“代码> JSON、StrugIng/<代码>或<代码>数组.Trimult.Studio函数(以及更多的全局、静态和原型方法)。他们根本不是建设者
是否所有(且仅)函数对象都实现了.prototype
不需要。.prototype
属性没有什么特别之处,只是在使用新建
构造实例时,它通常用于函数
。但每个对象都可以有或不能有.prototype
属性
正确的术语是通用对象还是函数对象
不,“一般对象”不是官方术语。我会给它们命名为不可调用对象,如果有必要的话(规范中使用了后一个术语)。谢谢你的建议。令人惊讶的是,MDN(以及整个web)对内置和对象包装、构造函数以及
.prototype
属性vs proto(原型链)缺乏良好的高层解释。关于第3点的后续问题:它是否被称为一般对象
和功能对象
?这些是官方条款吗?关于第2点:所有其他对象从中下降的所谓的全局对象
(原型链接)实际上是对象。原型
,而不是对象
,对吗?最后,关于1:Symbol
是一个原语,但大多数其他内置是函数对象
?我所知道的对象与函数对象之间没有“官方”术语;一般来说,人们在谈论/书写对象时使用“对象”,在谈论功能时使用“功能”。函数实际上是对象,你可以用普通对象做的任何事情都可以用函数(添加属性、删除属性等)。内置的符号实际上是一个函数(因此也是一个函数对象)。谢谢Bergi。但是只有构造函数本身具有.prototype
属性?常规对象(即非功能对象)默认不具有此属性吗?我想它只对构造函数才有意义,因为它用于设置用该函数创建的新对象的\uuuu proto\uuuu
。另外,通用对象
是不是不是不是函数对象
的正式术语?@Magnus Well{prototype:123}
是一个本机对象,它有一个,但不是函数(构造函数或其他)。是的,我不知道有哪一个内置的看起来像这样,但没有什么可以阻止它。@Magnus它们是内部的。检查一个对象不会显示它们(与该对象的许多其他对象一样)。请注意,[[scopes]]
和\uuuuu proto\uuuuu
也不是实际的属性,它们只是显示来表示一些内部值。@Magnus否。甚至不能保证这些值确实存在于引擎实现中。它们只在t中使用