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

JavaScript原型与Object理解:实例console.log输出属性疑问

为什么console.log输出myFather时只显示firstName等自有属性?

这个问题其实涉及到JavaScript里实例属性和原型属性的存储差异,以及控制台的默认显示规则,我给你一步步拆解:

1. 实例自有属性 vs 原型共享属性

当你通过new Person()创建myFather和myMother时:

  • 构造函数里用this.firstName = first这类语句赋值的属性,是直接挂载在实例对象本身的,属于实例的「自有属性」。每个Person实例都会有自己独立的这些属性副本,互不干扰。
  • 而Person.prototype.nationality = "English"是把属性挂载到了Person构造函数的原型对象上。所有通过new Person()创建的实例,都会共享这个原型对象——也就是说,myFather和myMother本身并没有nationality属性,当你访问myFather.nationality时,JavaScript会沿着「原型链」向上查找,直到在Person.prototype上找到这个属性。

2. 控制台的默认显示逻辑

浏览器或Node.js的console.log在输出对象时,默认只会展示对象自身的可枚举自有属性,不会把原型链上的属性直接平铺在对象的顶层结构里。不过你可以展开输出对象里的__proto__(或者标注为[[Prototype]])部分,就能看到原型上的nationality属性了。

3. 如何验证属性的归属?

你可以用Object.hasOwn()方法来判断属性是不是实例的自有属性:

console.log(Object.hasOwn(myFather, 'firstName')); // true,是自有属性
console.log(Object.hasOwn(myFather, 'nationality')); // false,来自原型

但这完全不影响你访问myFather.nationality——只要原型链上存在这个属性,就能正常获取到值,这就是原型继承的核心逻辑。

内容的提问来源于stack exchange,提问作者user9504869

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:35:36