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

