如果我理解正确,那么Javascript中的每个对象都是从Object原型继承的
看起来似乎有点麻烦,但是javascript(ECMAScript实现的通用术语)和ECMAScript(用于javascript实现的语言)之间是有区别的。定义继承方案的是ECMAScript,而不是javascript,因此仅本机ECMAScript对象需要实现该继承方案。
运行中的javascript程序至少包含内置ECMAScript对象(对象,函数,数字等),并且可能还包含一些本机对象(例如函数)。它还可能具有某些主机对象(例如浏览器中的DOM对象或其他主机环境中的其他对象)。
尽管内置对象和本机对象必须实现ECMA-262中定义的继承方案,但主机对象却不能。因此,并非javascript环境中的所有对象都必须继承自Object.prototype。例如,在IE中实现为ActiveX对象的宿主对象如果被视为本机对象,则会引发错误(因此,为什么使用try..catch初始化MS XMLHttpRequest对象)。如果将某些DOM对象(如怪癖模式下IE中的NodeLists)传递给Array方法,则会抛出错误,IE 8及更低版本中的DOM对象没有类似ECMAScript的继承方案,依此类推。
因此,不应假定javascript环境中的所有对象都继承自Object.prototype。
这意味着Javascript中的每个对象都可以通过其原型链访问hasOwnProperty函数
至少对于quirks模式下的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对象是否支持属性的一种常见(且似乎很成功)的方法。