例如,Array.from被称为方法,但Array.isArray被称为函数
https://www.ecma-international.org/ecma-262/8.0/index.html#sec-properties-of-the-array-constructor
在实践中,它们都可以作为函数调用(const arrFrom = Array.from; arrFrom('string');
),但是规范是否保证所有静态内置函数或某些或者没有?
不,没有保证。每种静态方法都有所不同。
对于任何给定的内置静态方法,查找其规范,如果它不引用this
,则它是一个函数。
Object
:没有一个静态Object
方法依赖于它们的接收器,它们不使用Object
构造函数,而只是操作它们的参数或创建一个新的普通对象。Function
,GeneratorFunction
,AsyncFunction
,Boolean
,Error
s,RegExp
,Map
,WeakMap
,Set
,WeakSet
,SharedArrayBuffer
,DataView
:这些构造函数都不包含任何静态方法Symbol
:没有一个静态Symbol
方法依赖于他们的接收器,他们不使用Symbol
构造函数Number
,Date
:他们的静态方法都不依赖于他们的接收器,他们只是操作他们的参数并返回一个原始数字。String
:没有一个静态String
方法依赖于它们的接收器,它们不使用String
构造函数,而只是操作它们的参数并返回一个原始字符串。Array
:
isArray
只返回一个布尔值
from
,of
:这些确实依赖于它们的接收器值,但是当它不是构造函数时,它们会回到默认的Array
上。这可能是为了向后兼容Array
不可扩展的时候。from
,of
:这些依赖于他们的接收器值是一个返回类型数组的构造函数ArrayBuffer
:
isView
只返回一个布尔值Math
,Atomics
,JSON
,Reflect
:无论如何,他们不是构造函数,他们的“方法”只是不依赖于接收者的命名空间函数Promise
:
all
,race
,reject
,resolve
:这些依赖于他们的接收器值是一个像Promise
一样工作的构造函数Proxy
并不是真正设计为可子类化的,它甚至不需要是构造函数。
revocable
:不依赖于它的接收器所以一般来说,大多数静态“方法”都只是命名空间函数,完全忽略了它们的接收器。然而,有一些方法返回它们被调用的构造函数的实例,最值得注意的是promise和(typed)数组方法,它们需要相应的接收器。 Object
和Array
是例外。