Если я правильно понимаю, каждый объект в Javascript наследуется от прототипа объекта
Это может показаться разделением волос, но есть разница между javascript (общий термин для реализаций ECMAScript) и ECMAScript (язык, используемый для реализаций javascript). Именно ECMAScript определяет схему наследования, а не javascript, поэтому только собственные объекты ECMAScript должны реализовывать эту схему наследования.
Работающая программа javascript состоит, по крайней мере, из встроенных объектов ECMAScript (объект, функция, число и т. Д.) И, возможно, некоторых собственных объектов (например, функций). Он также может иметь некоторые объекты хоста (например, объекты DOM в браузере или другие объекты в других средах хоста).
В то время как встроенные и собственные объекты должны реализовывать схему наследования, определенную в ECMA-262, объекты хоста этого не делают. Следовательно, не все объекты в среде javascript должны наследовать от Object.prototype . Например, объекты хоста в IE, реализованные как объекты ActiveX, будут вызывать ошибки, если они рассматриваются как собственные объекты (поэтому try..catch используется для инициализации объектов MS XMLHttpRequest). Некоторые объекты DOM (например, NodeLists в IE в режиме совместимости), если они переданы в методы Array, будут вызывать ошибки, объекты DOM в IE 8 и ниже не имеют схемы наследования, подобной ECMAScript, и так далее.
Поэтому не следует предполагать, что все объекты в среде javascript наследуются от Object.prototype.
что означает, что каждый объект в Javascript имеет доступ к функции hasOwnProperty через свою цепочку прототипов.
Что неверно для определенных объектов хоста в IE в режиме совместимости (и IE 8 и ниже всегда), по крайней мере.
Учитывая вышеизложенное, стоит задуматься, почему у объекта может быть свой собственный метод hasOwnProperty, и целесообразно вместо него вызвать какой-либо другой метод hasOwnProperty без предварительного тестирования, является ли это хорошей идеей или нет.
редактировать
Я подозреваю, что причина использования Object.prototype.hasOwnProperty.call
заключается в том, что в некоторых браузерах объекты хоста не имеют метода hasOwnProperty , альтернативой является использование call и встроенного метода. Однако делать это в целом не кажется хорошей идеей по причинам, указанным выше.
Что касается хост-объектов, оператор in может использоваться для проверки свойств в целом, например
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');
Альтернатива (проверено в IE6 и других):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
Таким образом, вы специально вызываете встроенный hasOwnProperty только там, где объект не имеет его (унаследованный или иным образом).
Однако, если у объекта нет hasOwnProperty
метода, вероятно, так же удобно использовать оператор in, поскольку объект, скорее всего, не имеет схемы наследования, и все свойства находятся в объекте (хотя это всего лишь предположение), например Оператор in - это распространенный (и, казалось бы, успешный) способ тестирования поддержки свойств объекта DOM.