Wenn ich das richtig verstehe, erbt jedes Objekt in Javascript vom Objektprototyp
Es mag wie Haarspalterei erscheinen, aber es gibt einen Unterschied zwischen Javascript (der Oberbegriff für ECMAScript-Implementierungen) und ECMAScript (die Sprache, die für Javascript-Implementierungen verwendet wird). Es ist ECMAScript, das ein Vererbungsschema definiert, nicht Javascript, sodass nur native ECMAScript-Objekte dieses Vererbungsschema implementieren müssen.
Ein laufendes Javascript-Programm besteht mindestens aus den integrierten ECMAScript-Objekten (Objekt, Funktion, Nummer usw.) und wahrscheinlich einigen nativen Objekten (z. B. Funktionen). Möglicherweise sind auch einige Hostobjekte vorhanden (z. B. DOM-Objekte in einem Browser oder andere Objekte in anderen Hostumgebungen).
Während integrierte und native Objekte das in ECMA-262 definierte Vererbungsschema implementieren müssen, tun dies Host-Objekte nicht. Daher sind nicht alle Objekte in einer JavaScript - Umgebung muss von erben Object.prototype . Beispielsweise lösen Hostobjekte im IE, die als ActiveX-Objekte implementiert sind, Fehler aus, wenn sie als native Objekte behandelt werden (daher wird try..catch zum Initialisieren von MS XMLHttpRequest-Objekten verwendet). Einige DOM-Objekte (wie NodeLists im IE im Quirks-Modus), die an Array-Methoden übergeben werden, werfen Fehler auf. DOM-Objekte in IE 8 und niedriger haben kein ECMAScript-ähnliches Vererbungsschema usw.
Daher sollte nicht davon ausgegangen werden, dass alle Objekte in einer Javascript-Umgebung von Object.prototype erben.
Dies bedeutet, dass jedes Objekt in Javascript über seine Prototypkette Zugriff auf die Funktion hasOwnProperty hat
Dies gilt zumindest nicht für bestimmte Hostobjekte im IE im Mackenmodus (und IE 8 und niedriger immer).
Vor diesem Hintergrund lohnt es sich zu überlegen, warum ein Objekt möglicherweise über eine eigene hasOwnProperty- Methode verfügt und ob es ratsam ist, eine andere aufzurufen ratsam ist , stattdessen hasOwnProperty- Methode aufzurufen , ohne vorher zu testen, ob dies eine gute Idee ist oder nicht.
Bearbeiten
Ich vermute, dass der Grund für die Verwendung darin Object.prototype.hasOwnProperty.call
besteht, dass Host-Objekte in einigen Browsern keine hasOwnProperty- Methode haben. Die Verwendung von call und der integrierten Methode ist eine Alternative. Dies generisch zu tun, scheint jedoch aus den oben genannten Gründen keine gute Idee zu sein.
Wo Host - Objekte betroffen sind, die in kann Operator Objekte allgemein Test verwendet werden, zB
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');
Eine Alternative (getestet in IE6 und anderen):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
Auf diese Weise rufen Sie nur die integrierte hasOwnProperty auf wo das Objekt sie nicht hat (geerbt oder anderweitig).
Wenn jedoch ein Objekt keinen hat hasOwnProperty
Methode, ist es wahrscheinlich genauso geeignet die die Verwendung in Bediener als das Objekt mit hohen Wahrscheinlichkeit kein Erbteil Schema hat und alle Eigenschaften sind auf dem Objekt (das ist nur eine Annahme , obwohl), zB die In Operator ist eine gängige (und scheinbar erfolgreiche) Methode zum Testen der DOM-Objektunterstützung für Eigenschaften.