Si entiendo correctamente, todos y cada uno de los objetos en Javascript heredan del prototipo de Objeto
Puede parecer que se parten los pelos, pero hay una diferencia entre javascript (el término genérico para las implementaciones de ECMAScript) y ECMAScript (el lenguaje utilizado para las implementaciones de javascript). Es ECMAScript el que define un esquema de herencia, no javascript, por lo que solo los objetos ECMAScript nativos necesitan implementar ese esquema de herencia.
Un programa javascript en ejecución consta de al menos los objetos ECMAScript integrados (Objeto, Función, Número, etc.) y probablemente algunos objetos nativos (por ejemplo, funciones). También puede tener algunos objetos de host (como objetos DOM en un navegador u otros objetos en otros entornos de host).
Si bien los objetos nativos e integrados deben implementar el esquema de herencia definido en ECMA-262, los objetos host no lo hacen. Por lo tanto, no todos los objetos en un entorno javascript deben heredar de Object.prototype . Por ejemplo, los objetos host en IE implementados como objetos ActiveX arrojarán errores si se tratan como objetos nativos (de ahí la razón por la que try..catch se usa para inicializar objetos MS XMLHttpRequest). Algunos objetos DOM (como NodeLists en IE en modo peculiar) si se pasan a métodos Array arrojarán errores, los objetos DOM en IE 8 y versiones inferiores no tienen un esquema de herencia similar a ECMAScript, y así sucesivamente.
Por lo tanto, no se debe asumir que todos los objetos en un entorno javascript heredan de Object.prototype.
lo que significa que todos y cada uno de los objetos en Javascript tienen acceso a la función hasOwnProperty a través de su cadena de prototipos
Lo cual no es cierto para ciertos objetos de host en IE en modo peculiar (e IE 8 e inferior siempre) al menos.
Dado lo anterior, vale la pena reflexionar sobre por qué un objeto podría tener su propio método hasOwnProperty y la conveniencia de llamar a otro método hasOwnProperty en su lugar sin probar primero si es una buena idea o no.
Editar
Sospecho que la razón para usarlo Object.prototype.hasOwnProperty.call
es que en algunos navegadores, los objetos de host no tienen un método hasOwnProperty , usar call y el método incorporado es una alternativa. Sin embargo, hacerlo de forma genérica no parece una buena idea por las razones mencionadas anteriormente.
En lo que respecta a los objetos del host, el operador in se puede utilizar para probar las propiedades en general, p. Ej.
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');
Una alternativa (probada en IE6 y otros):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
De esa manera, solo llama específicamente a la propiedad hasOwnProperty incorporada donde el objeto no la tiene (heredada o no).
Sin embargo, si un objeto no tiene un hasOwnProperty
método, probablemente sea tan adecuado usar el operador in , ya que el objeto probablemente no tenga un esquema de herencia y todas las propiedades estén en el objeto (eso es solo una suposición), por ejemplo, el El operador in es una forma común (y aparentemente exitosa) de probar el soporte de objetos DOM para propiedades.