判断JavaScript变量是否为可构造函数需满足:typeof为"function"、自身拥有prototype属性且其值为非null对象;箭头函数、bind函数、class方法等虽为function但无prototype,须排除。

要判断一个 JavaScript 变量既是 Function,又**具备原型(即拥有可访问的 prototype 属性)**,不能只看类型,还需验证其是否为“普通函数”——因为并非所有函数对象都拥有 prototype(例如箭头函数、bind 后的函数、class 中的实例方法等就没有)。
1. 先确认是 Function 类型
推荐用 typeof 快速筛选,它对所有标准函数(包括普通函数、箭头函数、async 函数、generator 函数)都返回 "function":
-
typeof fn === "function"—— 基础门槛,排除非函数值(null、undefined、对象、字符串等) - 注意:
typeof null是"object",但不会干扰此判断;typeof class {}是"function",class 声明本身也是函数
2. 再验证是否拥有 prototype 属性且为对象
只有**可被用作构造器的函数**才拥有有效的 prototype(即非箭头函数、非绑定函数、非类中的方法):
typeof fn === "function" && fn.prototype !== undefined && typeof fn.prototype === "object"- 更稳妥写法:用
Object.prototype.hasOwnProperty.call(fn, "prototype")确保该属性是自身属性(而非继承而来) - 补充检查:
fn.prototype.constructor === fn可进一步佐证它是“原生可构造函数”,但非必需(某些手动修改过 prototype 的函数可能不满足)
3. 排除常见无 prototype 的函数
以下函数类型 typeof 是 function,但没有 prototype,需主动过滤:
- 箭头函数:
() => {}—— 没有prototype属性 -
Function.prototype.bind()返回的函数 ——bind后函数不可构造,prototype为undefined - class 内部定义的方法(如
class A { m(){} }中的A.prototype.m)—— 是函数,但自身无prototype - 某些内置函数(如
Array.isArray)在部分环境可能不暴露prototype,应以实际存在性为准
4. 一行安全判断示例
综合以上,可封装为:
function isConstructorFunction(fn) {
return typeof fn === "function"
&& Object.prototype.hasOwnProperty.call(fn, "prototype")
&& typeof fn.prototype === "object"
&& fn.prototype !== null;
}
该函数返回 true 仅当变量是**可作为构造器使用的函数**(即具有有效 prototype),适用于需要 new 调用或扩展原型的场景。

















