需借用Object.prototype.hasOwnProperty以避免对象自身覆盖或原型污染导致的误判,正确写法为Object.prototype.hasOwnProperty.apply(obj, [prop]),确保调用原始方法并正确绑定this。

直接用 Object.prototype 上的方法(比如 hasOwnProperty)检测实例属性时,如果对象自身重写了同名方法或原型链被污染,就可能出错。用 apply 借用可以绕过这些干扰,确保调用的是原始、未被覆盖的版本。
为什么需要借用而不是直接调用
对象可能定义了自身的 hasOwnProperty,比如 { hasOwnProperty: false } 或更隐蔽的覆盖(如通过 Object.defineProperty 设置不可枚举、只读的同名属性)。直接写 obj.hasOwnProperty(prop) 会调用对象自己的方法,不一定可靠。而 Object.prototype.hasOwnProperty 是原始实现,但直接调用它(如 Object.prototype.hasOwnProperty(obj, prop))会丢失 this 绑定——必须用 apply 或 call 显式传入目标对象作为上下文。
正确写法:用 apply 绑定 this 并传参
标准做法是:
Object.prototype.hasOwnProperty.apply(obj, [prop])
等价于:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Object.prototype.hasOwnProperty.call(obj, prop)
两者都安全。推荐用 call(参数明确、性能略好),但题目要求用 apply,那就用数组传参形式。关键点:
-
apply的第一个参数是this,即你要检测的实例对象 - 第二个参数是数组,包含所有要传给原方法的参数(对
hasOwnProperty就是单个属性名) - 即使
obj是null或undefined,也会报错,所以实际使用前建议先做类型判断
实际使用时的注意事项
不是所有场景都需要这么“防御”,但以下情况建议强制借用:
- 处理用户输入或第三方库返回的对象(可能被篡改)
- 遍历对象属性前,想确认某 key 是否为自有属性(而非继承)
- 在工具函数中封装属性检测逻辑,追求健壮性
例如:
function hasOwn(obj, prop) {
return obj != null &&
typeof obj === 'object' &&
Object.prototype.hasOwnProperty.apply(obj, [prop]);
}
这样既避免了 null/undefined 报错,又绕过了对象自身方法的干扰。
替代方案与兼容性说明
现代环境可考虑 Object.hasOwn(obj, prop)(ES2022 新增),它是专门为解决这个问题设计的,语义清晰、无需绑定、且能正确处理 null/undefined(返回 false)。但它在旧浏览器(如 IE、Node.js < 16.9)不支持。若需兼容,借用 Object.prototype.hasOwnProperty 仍是稳妥选择。

















