关于console.log与Object.getPrototypeOf的控制台输出困惑
控制台显示原型对象的差异解释
先明确:你的代码逻辑完全没问题,Object.getPrototypeOf(john)确实等于Passenger.prototype,控制台显示的差异只是不同浏览器开发者工具的可视化策略不同,和代码本身的原型链结构无关。
为什么Chrome/Edge显示Person?
Chrome和Edge的控制台在显示原型对象时,会优先展示该原型对象的上级原型对应的类名,同时在展开后会显示自身的constructor属性。
你的代码中,Passenger.prototype的原型是Person.prototype,且Passenger.prototype本身没有自定义属性/方法(两个类的构造函数都是空的),所以控制台会简化显示为Person,但展开这个对象后,你能看到它的constructor是Passenger,也能看到完整的原型链层级。
这种显示逻辑的初衷是帮开发者快速定位原型的继承来源,但确实容易让不熟悉原型链的人产生误解。
为什么Firefox显示Object?
Firefox的控制台显示策略更偏向于展示对象的基础类型。由于所有自定义类的原型最终都会继承自Object.prototype,当原型对象没有独特的自定义内容时,Firefox会直接显示Object,同样展开后能看到完整的constructor和原型链信息。
如何确认原型的真实身份?
如果想避免显示带来的混淆,直接用严格相等运算符验证即可:
console.log(Object.getPrototypeOf(john) === Passenger.prototype); // true console.log(Object.getPrototypeOf(john) === Person.prototype); // false
或者在控制台中展开显示的对象,查看constructor属性和完整的原型链,就能看到最准确的结构。
内容的提问来源于stack exchange,提问作者Delmo
相关产品推荐
相关产品推荐

