Se bem entendi, todo e qualquer objeto em Javascript herda do protótipo do objeto
Pode parecer uma confusão, mas há uma diferença entre javascript (o termo genérico para implementações ECMAScript) e ECMAScript (a linguagem usada para implementações javascript). É o ECMAScript que define um esquema de herança, não o javascript, portanto, apenas os objetos ECMAScript nativos precisam implementar esse esquema de herança.
Um programa javascript em execução consiste em pelo menos os objetos ECMAScript embutidos (objeto, função, número, etc.) e provavelmente alguns objetos nativos (por exemplo, funções). Ele também pode ter alguns objetos de host (como objetos DOM em um navegador ou outros objetos em outros ambientes de host).
Embora os objetos integrados e nativos devam implementar o esquema de herança definido no ECMA-262, os objetos do host não. Portanto, nem todos os objetos em um ambiente javascript devem ser herdados de Object.prototype . Por exemplo, objetos de host no IE implementados como objetos ActiveX irão lançar erros se tratados como objetos nativos (daí porque try..catch é usado para inicializar objetos MS XMLHttpRequest). Alguns objetos DOM (como NodeLists no IE em modo quirks) se passados para métodos Array irão lançar erros, objetos DOM no IE 8 e inferior não têm um esquema de herança ECMAScript, e assim por diante.
Portanto, não deve ser assumido que todos os objetos em um ambiente javascript são herdados de Object.prototype.
o que significa que todo e qualquer objeto em Javascript tem acesso à função hasOwnProperty por meio de sua cadeia de protótipo
O que não é verdade para certos objetos de host no IE no modo quirks (e no IE 8 e inferior sempre), pelo menos.
Diante do exposto, vale a pena ponderar por que um objeto pode ter seu próprio método hasOwnProperty e a conveniência de chamar algum outro método hasOwnProperty , sem antes testar se isso é uma boa ideia ou não.
Editar
Suspeito que o motivo do uso Object.prototype.hasOwnProperty.call
é que, em alguns navegadores, os objetos de host não têm um método hasOwnProperty , usando call e o método integrado é uma alternativa. No entanto, fazer isso genericamente não parece uma boa ideia pelas razões mencionadas acima.
No que diz respeito a objetos hospedeiros, o operador in pode ser usado para testar propriedades em geral, por exemplo
var o = document.getElementsByTagName('foo');
// false in most browsers, throws an error in IE 6, and probably 7 and 8
o.hasOwnProperty('bar');
// false in all browsers
('bar' in o);
// false (in all browsers? Do some throw errors?)
Object.prototype.hasOwnProperty.call(o, 'bar');
Uma alternativa (testado no IE6 e outros):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
Dessa forma, você apenas chama especificamente a hasOwnProperty incorporada onde o objeto não a possui (herdada ou não).
No entanto, se um objeto não tiver um hasOwnProperty
método, é provavelmente tão adequado usar o operador in , pois o objeto provavelmente não tem um esquema de herança e todas as propriedades estão no objeto (embora isso seja apenas uma suposição), por exemplo, o O operador in é uma maneira comum (e aparentemente bem-sucedida) de testar o suporte a objetos DOM para propriedades.