Jeśli dobrze rozumiem, każdy obiekt w JavaScript dziedziczy po prototypie Object
Może się to wydawać rozszczepianiem włosów, ale istnieje różnica między javascript (ogólny termin na implementacje ECMAScript) a ECMAScript (język używany do implementacji javascript). To ECMAScript definiuje schemat dziedziczenia, a nie javascript, więc tylko natywne obiekty ECMAScript muszą implementować ten schemat dziedziczenia.
Działający program javascript składa się przynajmniej z wbudowanych obiektów ECMAScript (obiekt, funkcja, liczba itp.) I prawdopodobnie z niektórych obiektów natywnych (np. Funkcji). Może również zawierać obiekty hosta (takie jak obiekty DOM w przeglądarce lub inne obiekty w innych środowiskach hostów).
Podczas gdy obiekty wbudowane i natywne muszą implementować schemat dziedziczenia zdefiniowany w ECMA-262, obiekty hosta tego nie robią. Dlatego nie wszystkie obiekty w środowisku javascript muszą dziedziczyć po Object.prototype . Na przykład obiekty hosta w IE zaimplementowane jako obiekty ActiveX będą generować błędy, jeśli będą traktowane jako obiekty natywne (dlatego try..catch jest używany do inicjowania obiektów MS XMLHttpRequest). Niektóre obiekty DOM (takie jak NodeLists w IE w trybie dziwactw), jeśli zostaną przekazane do metod Array, będą powodować błędy, obiekty DOM w IE 8 i niższych nie mają schematu dziedziczenia podobnego do ECMAScript, i tak dalej.
Dlatego nie należy zakładać, że wszystkie obiekty w środowisku javascript dziedziczą po Object.prototype.
co oznacza, że każdy obiekt w JavaScript ma dostęp do funkcji hasOwnProperty poprzez swój łańcuch prototypów
Co nie jest prawdą w przypadku niektórych obiektów hosta w IE w trybie dziwactw (i IE 8 i niższych zawsze) przynajmniej.
Biorąc pod uwagę powyższe, warto zastanowić się, dlaczego obiekt może mieć własną metodę hasOwnProperty i celowość wywołania innej metody hasOwnProperty bez wcześniejszego sprawdzenia, czy jest to dobry pomysł, czy nie.
Edytować
Podejrzewam, że powodem używania Object.prototype.hasOwnProperty.call
jest to, że w niektórych przeglądarkach obiekty hosta nie mają metody hasOwnProperty , użycie wywołania i wbudowana metoda jest alternatywą. Jednak zrobienie tego ogólnie nie wydaje się dobrym pomysłem z powodów wymienionych powyżej.
Jeśli chodzi o obiekty hosta, operator in może być używany do testowania ogólnie właściwości, np
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');
Alternatywa (przetestowana w IE6 i innych):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
W ten sposób wywołujesz wbudowaną właściwość hasOwnProperty tylko wtedy, gdy obiekt jej nie ma (dziedziczony lub inny).
Jeśli jednak obiekt nie ma hasOwnProperty
metody, prawdopodobnie równie dobrze jest użyć operatora in , ponieważ obiekt prawdopodobnie nie ma schematu dziedziczenia, a wszystkie właściwości są na obiekcie (to tylko założenie), np. operator in jest powszechnym (i pozornie skutecznym) sposobem testowania obsługi właściwości obiektów DOM.