javascript中自有属性与继承属性可共存,访问时优先读取自有属性,未找到才沿原型链查找;同名赋值会创建自有属性并屏蔽继承属性;hasownproperty用于准确判断属性是否为自有属性,object.getownpropertynames仅返回自有属性键名。

JavaScript 中自有属性(own property)和继承属性能共存,关键在于属性访问时的“查找优先级”和赋值时的“屏蔽机制”。它们不是互斥关系,而是按规则协同工作的。
自有属性优先被读取,不干扰原型链
当你访问一个对象的属性时,引擎会先检查该对象自身是否含有这个属性:
- 如果存在,直接返回自有属性的值,不会继续向上查找;
- 如果不存在,才顺着
__proto__链逐级向上搜索,直到找到或抵达Object.prototype(其__proto__为null)。
例如:
function Person() { this.name = 'Alice'; }<br>Person.prototype.age = 30;<br>const p = new Person();<br>console.log(p.name); // 'Alice'(自有)<br>console.log(p.age); // 30(继承自原型)
同名赋值会创建自有属性,自动屏蔽继承属性
给对象设置一个它原本没有的属性,会直接添加为自有属性;若该属性已在原型链中存在,新赋值不会修改原型,而是在当前对象上“覆盖式新建”,形成屏蔽(shadowing):
-
p.age = 31→p现在有了自有属性age,值为31; - 原型上的
Person.prototype.age仍为30,其他实例不受影响; -
console.log(p.age)输出31,因为自有属性优先。
用 hasOwnProperty 区分两者,避免误判
判断一个属性是否属于对象自身,不能靠 in 运算符(它查整条原型链),而要用 hasOwnProperty:
-
p.hasOwnProperty('name')→ true(自有); -
p.hasOwnProperty('age')→ false(初始时是继承的); -
'age' in p→ true(无论自有还是继承,只要存在就返回 true)。
注意:hasOwnProperty 本身是继承自 Object.prototype 的方法,所以它必须确保不被意外覆盖——推荐写法是 Object.prototype.hasOwnProperty.call(p, 'name'),以防对象自身定义了同名属性。
Object.getOwnPropertyNames 只看自有属性
这个方法只返回对象自身的所有属性键名(包括不可枚举的),完全忽略原型链:
-
Object.getOwnPropertyNames(p)返回['name'](假设未手动添加其他自有属性); - 即使
p能访问toString、age等,它们都不会出现在结果中; - 若想获取所有可枚举的自有属性,用
Object.keys(p)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











