前言
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
方法进行检查。
收摊!🫏🫏🫏