浅谈Object.prototype.hasOwnProperty.call(a, b)

前言

Object.prototype.hasOwnProperty.call 是 JavaScript 中一种常用的方式来检查一个对象是否具有某个特定的自有属性(即不是继承自原型链的属性)。它结合了 Object.prototype.hasOwnProperty 方法和 Function.prototype.call 方法来实现这一功能。

1. Object.prototype.hasOwnProperty

  • 作用 :hasOwnProperty 是 Object.prototype 上的一个方法,用于检查一个对象是否具有某个指定的自有属性(即直接定义在对象上的属性,而不是从原型链继承的属性)。
  • 用法 :object.hasOwnProperty(prop),其中 object 是要检查的对象,prop 是要检查的属性名。

例如:

javascript 复制代码
const obj = { a: 1 };
console.log(obj.hasOwnProperty("a")); // true,因为 "a" 是 obj 的自有属性
console.log(obj.hasOwnProperty("toString")); // false,因为 "toString" 是从原型链继承的

2. Function.prototype.call

  • 作用 :call 方法用于调用一个函数,并显式地指定函数的上下文(this 值),同时还可以传递参数。
  • 用法 :function.call(thisArg, arg1, arg2, ...),其中 thisArg 是函数执行时的上下文,arg1、arg2 等是传递给函数的参数。

例如:

javascript 复制代码
function greet(name) {
  return `Hello, ${name}! I am ${this.name}`;
}
const person = { name: "jjq" };
console.log(greet.call(person, "jiangjianqing")); // "Hello, jiangjianqing! I am jjq"

3. Object.prototype.hasOwnProperty.call

将 Object.prototype.hasOwnProperty 和 Function.prototype.call 结合起来,可以实现以下功能:

  • 作用 :通过 call 方法,将 Object.prototype.hasOwnProperty 方法绑定到任意对象上(调用Object.prototype上的hasOwnProperty方法并将上下文与自定义的内容相互绑定,其作用就像是将Object.prototype上的hasOwnProperty暂时性地绑定到了自定义的内容上!!从而避免某些恶意代码 故意污染某些方法),并检查该对象是否具有某个自有属性。这种方式可以避免直接在对象上调用 hasOwnProperty 时可能遇到的问题,例如对象本身覆盖了 hasOwnProperty 方法。
  • 用法 :Object.prototype.hasOwnProperty.call(object, prop),其中 object 是要检查的对象,prop 是要检查的属性名。

示例

javascript 复制代码
const obj = { a: 1, hasOwnProperty: function() { return false; } };// 假设此处有恶意代码污染了hasOwnProperty方法

// 直接调用 obj.hasOwnProperty 会返回 false,因为 obj 自己覆盖了 hasOwnProperty 方法
console.log(obj.hasOwnProperty("a")); // false

// 使用 Object.prototype.hasOwnProperty.call 来检查(❗❗注意 我调用的是Object.prototype上的hasOwnProperty方法,然后临时绑定了这个方法执行时候的上下文,所以不用担心原型污染问题!!!)
console.log(Object.prototype.hasOwnProperty.call(obj, "a")); // true

在这个例子中,obj 自己覆盖了 hasOwnProperty 方法,导致直接调用 obj.hasOwnProperty 时无法正确检查属性。而通过 Object.prototype.hasOwnProperty.call,可以绕过对象自身的覆盖 ,直接使用原型链上的 hasOwnProperty 方法,从而正确检查自有属性。

总结

Object.prototype.hasOwnProperty.call 是一种安全、可靠的方式来检查对象的自有属性,尤其适用于需要避免对象自身覆盖原型方法的场景。它利用了 call 方法的上下文绑定特性,确保始终使用原型链上的 hasOwnProperty 方法进行检查。

收摊!🫏🫏🫏

相关推荐
wdfk_prog2 分钟前
Wi-Fi Direct 教程 05:control socket 与 eloop——P2P_FIND 怎样进入 wpa_supplicant 命令解析器
运维·服务器·后端·网络协议·ubuntu·p2p·wifi-direct
IT_陈寒29 分钟前
Python的GIL锁让我把多线程代码全重写了!
前端·人工智能·后端
百度一下吧38 分钟前
umi后台管理项目实战:从工程搭建到生产构建
java·前端·javascript
haerapi39 分钟前
仓库拣货路线不只靠最短边:S 形启发式的反例记录
android·开发语言·javascript
事圆则缓1 小时前
Flutter 状态管理框架对比(六):同一个购物车,四种方案怎么落地?
前端·javascript·flutter
500841 小时前
React Native for OpenHarmony 实战:三方库 react-native-torch 的鸿蒙化适配指南
javascript·react native·react.js·harmonyos
马剑威(威哥爱编程)1 小时前
【AI全栈后端12-04】Spring Boot 用结构化输出自动解析简历:让模型按你的 POJO 输出
java·人工智能·spring boot·后端
500842 小时前
React Native for OpenHarmony 实战:三方库 react-native-device-uptime 的鸿蒙化适配指南
javascript·分布式·react native·react.js·harmonyos
我的xiaodoujiao2 小时前
Django 基础知识详细图文教程 12-Django 模型定义与使用 2
后端·python·django
孙启超3 小时前
【AI开发之Rust】第 22 课:一键多平台与工程收尾 —— CI、发布检查与结课
开发语言·后端·rust