修复"不要从目标对象访问Object.prototype方法hasOwnProperty"报错
报错原因
这个报错不是JavaScript运行时的原生错误,是ESLint等代码校验工具的no-prototype-builtins规则拦截提示。
MDN的写法本身是合法的JavaScript语法,校验工具之所以限制这种写法,是为了规避两种边界场景的风险:
- 如果目标对象是通过
Object.create(null)创建的,它本身没有继承Object.prototype,原型链上不存在hasOwnProperty方法,直接调用会抛出未定义错误 - 如果目标对象自身自定义了同名的
hasOwnProperty属性/方法,会覆盖原型上的原生实现,导致执行逻辑不符合预期
修复方案
方案1:调用Object.prototype.hasOwnProperty并绑定this指向(兼容性最好)
const myObj = { prop1: 'val1', prop2: 'val2' } if (!Object.prototype.hasOwnProperty.call(myObj, 'prop3')) { myObj.prop3 = 'val3' }
方案2:使用ES2022新增的Object.hasOwn()静态方法(写法更简洁)
如果你的运行环境支持ES2022及以上语法,推荐使用这个方案:
const myObj = { prop1: 'val1', prop2: 'val2' } if (!Object.hasOwn(myObj, 'prop3')) { myObj.prop3 = 'val3' }
方案3:临时关闭ESLint规则(不推荐)
如果确认你的业务场景不会出现前面提到的边界风险,可以通过注释临时禁用对应校验规则:
const myObj = { prop1: 'val1', prop2: 'val2' } // eslint-disable-next-line no-prototype-builtins if (!myObj.hasOwnProperty('prop3')) { myObj.prop3 = 'val3' }
内容的提问来源于stack exchange,提问作者drake035
相关产品推荐
相关产品推荐

