javascript原生构造函数(如array、date)可通过tostring标签、全局变量相等性、不可删除/不可写属性及native code字符串识别,而自定义类不具备这些底层特征。

区分 JavaScript 引擎原生的函数(如 Array、Date、Function)和自定义类(即用户用 function 或 class 定义的构造器),关键在于识别其“来源身份”——不是看写法,而是看它是否由 JS 引擎内置提供、是否具有不可伪造的底层特征。
看 toString() 返回的内部标签
所有对象(包括函数)调用 Object.prototype.toString.call() 会返回标准格式的字符串,原生构造函数有固定标识:
-
Object.prototype.toString.call(Array)→"[object Array]" -
Object.prototype.toString.call(Date)→"[object Date]" -
Object.prototype.toString.call(Function)→"[object Function]" - 而自定义类(哪怕叫
class MyClass{})返回的是"[object Function]"—— 和原生函数一样,但无法单独靠这个判断“是否原生”
检查 constructor 是否指向原生全局对象
原生构造函数通常直接等于全局环境中的同名变量:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
Array === window.Array(浏览器中)或globalThis.Array→ true -
MyClass === window.MyClass→ 仅当显式挂到全局才成立,且不等于任何内置构造器 - 更可靠的方式:
Array.constructor === Function(所有函数都是Function实例),但Array === Function是 false;而Array === Array恒为 true,可用于跨上下文比对(如 iframe 中需谨慎)
观察行为与不可配置性
原生构造函数通常具备以下特征,自定义类一般不具备:
- 无法删除:
delete Array返回false(严格模式报错) -
Array.length不可写(Object.getOwnPropertyDescriptor(Array, 'length').writable为false) - 原型链终点是
Object.prototype,但其prototype对象本身不可枚举、不可重写(Object.getOwnPropertyNames(Array.prototype)返回大量内置方法,且Array.prototype.push的configurable为false) - 自定义类的
prototype默认可扩展、可修改,除非手动Object.freeze()
用 Function.prototype.toString() 辅助判断
对函数本身调用 .toString():
-
Array.toString()返回"function Array() { [native code] }" -
class A{}.toString()或function B(){}返回带具体源码或"function B() { [native code] }"(注意:箭头函数、类方法等可能不显示[native code]) - ⚠️ 该方式非 100% 可靠(某些 polyfill 或压缩工具可能伪造),但结合前几项可大幅提高置信度










