我最近一直在研究 JavaScript,在花了几个月的时间后,我仍然对一些内部结构感到困惑。
具体来说,我试图理解所谓的 Standard Built-In Objects .
我所知道的
- JavaScript 中的所有函数,无论是内置函数还是用户创建的函数,都是对象(
函数对象
) 通用对象
和函数对象
之间的区别在于函数对象
实现了[[Call]]
属性(因此可以被调用)- 所有
函数对象
都实现.prototype
属性,该属性表示使用函数对象
作为构造函数创建的所有对象的原型(prototype)<
问题
- 所有
标准内置对象
实际上都是函数对象
(即构造函数)吗? - 所有(且仅)
函数对象
都实现.prototype
吗? - 正确的术语是
通用对象
还是函数对象
?
谢谢。
最佳答案
All function objects implement the
.prototype
property, which represents the prototype of all objects created with the function object as a constructor
没有。只有构造函数可以做到这一点。有些函数不是构造函数(即它们有 [[call]] 但没有 [[construct]] 内部方法),当您尝试将它们与 new
一起使用时,它们会抛出错误(就像一些函数具有 [[construct]] 内部方法,但仍然会抛出异常)。
从技术上讲,即使构造函数也不一定需要 .prototype
。您可以实现一个可以构造但没有 .prototype
属性的内置函数。然而,所有 native 构造函数确实都有一个。
Are all the Standard Built-In Objects actually function objects?
没有。考虑 Math
、JSON
、Atomics
或 Reflect
内置对象。它们根本不是函数。
function objects (i.e. constructor functions)?
没有。考虑一下 parseInt、JSON.stringify 或 Array.prototype.slice 函数(以及更多全局、静态和原型(prototype)方法)。他们根本不是构造函数。
Do all (and only) function objects implement
.prototype
?
没有。 .prototype
属性没有什么特别之处,只是它通常在使用 new
构造实例时用在 function
上。但每个对象都可以有或不能有 .prototype
属性。
Are the right terms general object vs function object?
不,“一般对象”不是一个官方术语。我将它们命名为不可调用对象和 callable objects如果我必须这样做(规范中使用了后一个术语)。
关于JavaScript:所有标准内置对象实际上都是构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49431846/