obj.hasOwnProperty(k) fails on an object created with a null prototype and can be shadowed by a property called hasOwnProperty.
const o = Object.create(null)
o.k = 1
o.hasOwnProperty('k') // TypeError: not a function
Object.prototype.hasOwnProperty.call(o, 'k') // true, verbose
Object.hasOwn(o, 'k') // true
// and the shadowing case, which is why linters flagged it:
const parsed = JSON.parse('{"hasOwnProperty": 1}')
parsed.hasOwnProperty('x') // TypeError
The shadowing case arrives from parsed JSON, which is exactly where a key check is most needed — so the lint rule against calling it directly has been correct for years and the verbose workaround was what everybody actually wrote. This is one of the small additions that removes a rule from a style guide.