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
相关产品推荐
相关产品推荐

