async函数本质是函数,但其静态属性和原型链与普通函数存在规范级差异:object.prototype.tostring.call(asyncfn)返回"[object asyncfunction]",且object.getprototypeof(asyncfn).constructor.name为"asyncfunction"。

async 函数本质上是函数,但它在静态属性和原型链层面与普通函数有明确、可检测的差异——不是靠行为(比如是否用了 await),而是靠语言规范定义的内部结构。
静态属性:AsyncFunction 构造器不可见但可识别
普通函数由 Function 构造器创建,而 async 函数由引擎内部的 AsyncFunction 构造器创建。虽然 AsyncFunction 不暴露在全局作用域中(不能直接访问 window.AsyncFunction),但可通过间接方式确认:
-
Object.getPrototypeOf(asyncFn).constructor.name返回 "AsyncFunction",而普通函数返回 "Function" -
asyncFn.constructor === Function为 false;普通函数则为 true - 所有 async 函数共享同一个隐式原型对象,该原型对象的
Symbol.toStringTag值为 "AsyncFunction",因此Object.prototype.toString.call(asyncFn)返回 "[object AsyncFunction]"
原型链结构:多一层 AsyncFunction.prototype
普通函数的原型链是:fn → Function.prototype → Object.prototype → null
async 函数的原型链是:asyncFn → AsyncFunction.prototype → Function.prototype → Object.prototype → null
关键区别在于中间多了一层 AsyncFunction.prototype。这一层继承自 Function.prototype,所以 async 函数仍具备所有函数通用方法(如 call、bind),但它自身原型上不额外挂载用户可访问的属性或方法。
无法通过 typeof 或 instanceof 区分
typeof asyncFn 和 typeof normalFn 都是 "function",所以不能用它判断。
asyncFn instanceof Function 返回 true(因为 AsyncFunction.prototype 是 Function.prototype 的子对象),所以 instanceof 也无法可靠区分。
真正有效的判断方式只有两种:
– 检查 Object.prototype.toString.call(fn) 是否等于 "[object AsyncFunction]"
– 或检查 Object.getPrototypeOf(fn).constructor.name === "AsyncFunction"
没有“async 函数的静态方法”这种东西
async 关键字只影响函数的执行模型和返回值类型,不改变其作为构造器或类的语义。它不像 class 那样支持 static 方法语法(async static method() 是合法的,但那是类的静态方法,不是 async 函数自身的静态属性)。
也就是说:
– async function foo(){} 本身没有专属的静态属性(如 foo.someStaticProp)
– 它的“静态性”仅体现在构造器身份(AsyncFunction)和原型链结构上,而非可编程扩展的接口











