为何在对象原型方法中使用call?hasOwnProperty调用方式疑问
为什么直接调用
Object.prototype.hasOwnProperty(x, 'name')无法正常工作? 要搞懂这个问题,得先明确JavaScript里方法调用的this绑定规则,以及hasOwnProperty方法的工作逻辑:
hasOwnProperty的本质hasOwnProperty是定义在Object.prototype上的方法,它的作用是检查当前this指向的对象是否包含指定的自有属性,而且它只接受一个参数——就是要检查的属性名。直接调用时的问题
当你直接写Object.prototype.hasOwnProperty(x, 'name')时:- 方法内部的
this并没有绑定到你要检查的对象x,而是默认绑定到全局对象(非严格模式)或者undefined(严格模式)。 - 你传入的第一个参数
x会被直接忽略(因为方法只需要一个参数),第二个参数'name'才是它要检查的属性名。
本质上你是在检查全局对象(或undefined)有没有'name'属性,而非对象x的,自然得不到预期结果。
- 方法内部的
用
call的原因call方法的核心作用就是手动改变函数内部的this指向。当你写Object.prototype.hasOwnProperty.call(x, 'name')时:- 第一个参数
x会被绑定到hasOwnProperty内部的this,让方法的检查目标变成x。 - 第二个参数
'name'作为属性名传入,这样方法就会正确检查x是否包含这个自有属性。
- 第一个参数
额外补充:为什么不直接用x.hasOwnProperty('name')?因为有些对象可能被修改过原型,或是通过Object.create(null)创建的(完全没有原型链),这时候x本身没有hasOwnProperty方法,直接调用会报错。而Object.prototype.hasOwnProperty.call的写法能避开这类问题,是更安全的通用写法。
内容的提问来源于stack exchange,提问作者displayName
相关产品推荐
相关产品推荐

