判断属性是否在原型链上:prop in obj 且 !obj.hasownproperty(prop);或手动遍历原型链用 object.getprototypeof 检查各层 hasownproperty。

用 hasOwnProperty 可以判断属性是否在**自身对象上**,而判断是否在**原型链上**(即继承而来、自身没有但能访问到),关键是要排除自身属性,只看原型链上的存在性。
用 in 操作符配合 hasOwnProperty
这是最直接的方式:属性在原型链上 ⇔ in 返回 true 且 hasOwnProperty 返回 false。
例如:
const parent = { a: 1 };
const child = Object.create(parent);
child.b = 2;
console.log('a' in child); // true(可访问,来自原型)
console.log(child.hasOwnProperty('a')); // false(自身没有)
console.log('b' in child); // true(自身有)
console.log(child.hasOwnProperty('b')); // true
// 所以判断是否在原型链上:
function isInPrototype(obj, prop) {
return prop in obj && !obj.hasOwnProperty(prop);
}
console.log(isInPrototype(child, 'a')); // true
console.log(isInPrototype(child, 'b')); // false
用 Object.getPrototypeOf 手动遍历原型链
如果需要更精细控制(比如想确认在哪一层原型上),可以手动向上查找,跳过自身对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 从
Object.getPrototypeOf(obj)开始 - 逐级检查
hasOwnProperty,直到返回true或原型为null
function isInPrototypeChain(obj, prop) {
let proto = Object.getPrototypeOf(obj);
while (proto !== null) {
if (proto.hasOwnProperty(prop)) return true;
proto = Object.getPrototypeOf(proto);
}
return false;
}
这个方法不依赖 in(后者会触发 getter,且对不可枚举属性也返回 true),更适合精确判断“是否在某个原型对象上定义”。
注意:in 和 hasOwnProperty 的行为差异
它们的区别直接影响判断逻辑:
-
prop in obj:检查整个原型链 + 自身,包括不可枚举属性 -
obj.hasOwnProperty(prop):只查自身对象,不查原型,且只返回可枚举属性(严格来说,它对所有自有属性都有效,无论是否可枚举;ES5+ 中不可枚举自有属性也会被hasOwnProperty认为存在) - 所以
in为true且hasOwnProperty为false⇒ 属性一定在原型链上(不管是否可枚举)
避免误判的常见陷阱
以下情况容易导致错误结论:
- 属性值为
undefined:不能用obj.prop === undefined判断是否存在,因为可能真有该属性且值就是undefined - 使用
for...in:它会遍历可枚举的自身和继承属性,但无法区分来源;需搭配hasOwnProperty过滤 - 访问器属性(getter):即使原型上只有 getter,
in仍返回true,hasOwnProperty为false,仍算“在原型链上”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










