You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中实例方法获取、原型打印异常及直接检查数值变量方法的技术咨询

问题解答

为什么第二、第三个console.log打印{}?

这其实是浏览器/Node.js控制台的显示优化造成的错觉——本质上Object.getPrototypeOf(n)和Object.getPrototypeOf(5)返回的就是Number.prototype,和你第一个打印的属性列表所属的对象完全是同一个。

原因在于:JavaScript的原始值(比如数字、字符串)本身并不是对象,但当你尝试访问它们的原型或属性时,JS会自动创建一个临时的包装对象(比如对应数字的Number对象),这个包装对象的原型就是Number.prototype。而控制台默认打印这个临时包装对象时,只会显示它自身的空属性(包装对象本身没有自定义属性),隐藏了原型链上的所有方法,所以看起来是{}。

你可以通过以下代码验证这一点:

// 验证两个原型是否为同一个对象
console.log(Object.getPrototypeOf(n) === Number.prototype); // 输出 true
console.log(Object.getPrototypeOf(5) === Number.prototype); // 输出 true

// 用console.dir替代console.log,展开显示完整的原型结构
console.dir(Object.getPrototypeOf(n));
console.dir(Object.getPrototypeOf(5));

无需引用Number.prototype,直接检查变量/数字方法的方式

当然有几种实用的方法:

  • 使用console.dir():它会详细展示对象的原型链结构,对于原始值,会自动展示其包装对象的完整原型信息:

    console.dir(n);
    console.dir(5);
    

    展开后就能看到所有Number原型上的方法(比如toFixed、toString等)。

  • 获取原型的所有属性描述:用Object.getOwnPropertyDescriptors()可以拿到原型上所有自身属性(包括不可枚举的)的详细信息:

    console.log(Object.getOwnPropertyDescriptors(Object.getPrototypeOf(n)));
    
  • 获取原型的所有键(含符号属性):Reflect.ownKeys()会返回原型上所有自身属性的名称,包括字符串和符号类型的属性:

    console.log(Reflect.ownKeys(Object.getPrototypeOf(n)));
    

另外,你也可以直接调用变量的constructor.prototype来获取原型,效果和Object.getPrototypeOf()一致:

console.log(n.constructor.prototype); // 等同于Number.prototype
console.log((5).constructor.prototype); // 注意数字字面量要加括号,避免语法错误

内容的提问来源于stack exchange,提问作者carl.hiass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:44:08