Se ho capito bene, ogni oggetto in Javascript eredita dal prototipo Object
Potrebbe sembrare una rottura di peli, ma c'è una differenza tra javascript (il termine generico per le implementazioni ECMAScript) e ECMAScript (il linguaggio utilizzato per le implementazioni javascript). È ECMAScript che definisce uno schema di ereditarietà, non javascript, quindi solo gli oggetti ECMAScript nativi devono implementare quello schema di ereditarietà.
Un programma javascript in esecuzione è costituito almeno dagli oggetti ECMAScript incorporati (Object, Function, Number, ecc.) E probabilmente da alcuni oggetti nativi (ad es. Funzioni). Potrebbe anche avere alcuni oggetti host (come oggetti DOM in un browser o altri oggetti in altri ambienti host).
Mentre gli oggetti incorporati e nativi devono implementare lo schema di ereditarietà definito in ECMA-262, gli oggetti host non lo fanno. Pertanto, non tutti gli oggetti in un ambiente javascript devono ereditare da Object.prototype . Ad esempio, gli oggetti host in IE implementati come oggetti ActiveX genereranno errori se trattati come oggetti nativi (ecco perché try..catch viene utilizzato per inizializzare gli oggetti XMLHttpRequest di MS). Alcuni oggetti DOM (come NodeLists in IE in modalità quirks) se passati ai metodi Array genereranno errori, gli oggetti DOM in IE 8 e versioni precedenti non hanno uno schema di ereditarietà simile a ECMAScript e così via.
Pertanto non si dovrebbe presumere che tutti gli oggetti in un ambiente javascript ereditino da Object.prototype.
il che significa che ogni oggetto in Javascript ha accesso alla funzione hasOwnProperty attraverso la sua catena di prototipi
Il che non è vero per alcuni oggetti host in IE in modalità quirks (e IE 8 e versioni precedenti sempre) almeno.
Considerato quanto sopra, vale la pena riflettere sul motivo per cui un oggetto potrebbe avere il proprio metodo hasOwnProperty e sull'opportunità di chiamare qualche altro hasOwnProperty metodo invece senza prima verificare se questa è una buona idea o meno.
modificare
Sospetto che il motivo per l'utilizzo Object.prototype.hasOwnProperty.call
sia che in alcuni browser, gli oggetti host non hanno un metodo hasOwnProperty , utilizzando call e il metodo integrato è un'alternativa. Tuttavia, farlo genericamente non sembra una buona idea per i motivi sopra indicati.
Dove oggetti host concerne l' in operatore può essere utilizzato per prove per proprietà generalmente, ad esempio
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');
Un'alternativa (testata in IE6 e altri):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
In questo modo si chiama in modo specifico solo hasOwnProperty incorporato dove l'oggetto non lo possiede (ereditato o altro).
Tuttavia, se un oggetto non dispone di un hasOwnProperty
metodo, è probabilmente altrettanto adatto per utilizzare il nel dell'operatore come l'oggetto probabilmente non ha un sistema di eredità e tutte le proprietà sono l'oggetto (che è solo una supposizione però), ad esempio, il in operator è un modo comune (e apparentemente efficace) di testare il supporto degli oggetti DOM per le proprietà.