判断属性归属的核心方法是hasOwnProperty():返回true为实例属性,false则需结合in操作符判断——'prop' in obj && !obj.hasOwnProperty('prop')为原型属性,!('prop' in obj)为不存在。

在 JavaScript 中,判断一个属性是原型属性还是实例属性,核心方法是使用 hasOwnProperty() —— 它只对**对象自身(实例)拥有的属性**返回 true,而对从原型链继承来的属性返回 false。
用 hasOwnProperty() 判断是否为实例属性
这是最直接、最常用的方式:
- 如果
obj.hasOwnProperty('prop')返回true,说明prop是该对象自身的属性(即实例属性); - 如果返回
false,则该属性可能来自原型(也可能是根本不存在,需结合in操作符进一步确认)。
结合 in 操作符区分“存在但非自有”
in 操作符会检查属性是否在对象自身或其原型链上存在。配合 hasOwnProperty() 就能明确归属:
-
'prop' in obj && !obj.hasOwnProperty('prop')→ 属性存在于原型链上,不是实例属性; -
obj.hasOwnProperty('prop')→ 实例属性; -
!('prop' in obj)→ 属性完全不存在。
注意:Object.prototype 上的属性会影响判断
所有普通对象都继承自 Object.prototype,所以像 toString、valueOf 这些方法默认是原型属性:
立即学习“Java免费学习笔记(深入)”;
const obj = { name: 'Alice' };
console.log(obj.hasOwnProperty('name')); // true(实例属性)
console.log(obj.hasOwnProperty('toString')); // false(原型属性)
console.log('toString' in obj); // true(原型链上有)
如果对象显式设置了同名属性(如 obj.toString = function(){}),它就变成实例属性,hasOwnProperty 会返回 true。
扩展:获取所有自有属性名可用 Object.keys()
Object.keys(obj) 只返回对象自身的可枚举属性名(不包括原型上的),适合批量检查实例属性:
-
Object.keys(obj)→ 实例属性名数组; -
Object.getOwnPropertyNames(obj)→ 包含不可枚举的自有属性; - 想看原型链上的所有可枚举属性?需手动遍历
Object.getPrototypeOf(obj)等。


















