私が正しく理解していれば、JavaScriptのすべてのオブジェクトはオブジェクトプロトタイプを継承しています
髪の毛を裂くように見えるかもしれませんが、 JavaScript(ECMAScript実装の総称)とECMAScript(JavaScript実装に使用される言語)には違いがあります。JavaScriptではなく継承スキームを定義するのはECMAScriptであるため、ネイティブECMAScriptオブジェクトのみがその継承スキームを実装する必要があります。
実行中のJavaScriptプログラムは、少なくとも組み込みのECMAScriptオブジェクト(Object、Function、Numberなど)と、おそらくいくつかのネイティブオブジェクト(関数など)で構成されています。また、いくつかのホストオブジェクト(ブラウザのDOMオブジェクト、または他のホスト環境の他のオブジェクトなど)が含まれている場合もあります。
組み込みオブジェクトとネイティブオブジェクトはECMA-262で定義されている継承スキームを実装する必要がありますが、ホストオブジェクトは実装しません。したがって、JavaScript環境のすべてのオブジェクトがObject.prototypeから継承する必要はありません。たとえば、ActiveXオブジェクトとして実装されたInternet Explorerのホストオブジェクトは、ネイティブオブジェクトとして扱われるとエラーをスローします(したがって、try..catchを使用してMicrosoft XMLHttpRequestオブジェクトを初期化します)。一部のDOMオブジェクト(QuirksモードのInternet ExplorerのNodeListsなど)は、Arrayメソッドに渡されるとエラーをスローし、Internet Explorer 8以下のDOMオブジェクトには、ECMAScriptのような継承スキームがありません。
したがって、JavaScript環境内のすべてのオブジェクトがObject.prototypeから継承すると想定するべきではありません。
つまり、JavaScriptのすべてのオブジェクトは、プロトタイプチェーンを介してhasOwnProperty関数にアクセスできます。
これは、少なくともQuirksモード(およびInternet Explorer 8以下)のInternetExplorerの特定のホストオブジェクトには当てはまりません。
上記を考えると、オブジェクトが独自のhasOwnPropertyメソッドを持っている理由と、それが良いアイデアかどうかを最初にテストせずに、代わりに他のhasOwnPropertyメソッドを呼び出すことをお勧めします。
使用する理由Object.prototype.hasOwnProperty.call
は、一部のブラウザでは、ホストオブジェクトにhasOwnPropertyメソッドがなく、呼び出しを使用し、組み込みのメソッドが代替手段であるためだと思います。ただし、上記の理由から、一般的にそうすることは良い考えとは思えません。
ホストオブジェクトが関係する場合、in演算子を使用して、一般的にプロパティをテストできます。
var o = document.getElementsByTagName('foo');
// false in most browsers, throws an error in Internet Explorer 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');
別の方法( Internet Explorer 6などでテスト済み):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
そうすれば、オブジェクトに(継承されているかどうかにかかわらず)組み込まれていないhasOwnPropertyのみを具体的に呼び出すことができます。
ただし、オブジェクトにメソッドがない場合は、オブジェクトに継承スキームがなく、すべてのプロパティがオブジェクト上にあるのと同じように、 inhasOwnProperty
演算子を使用するのがおそらく適切です(ただし、これは単なる仮定です)。in演算子は、プロパティのDOMオブジェクトサポートをテストする一般的な(そして成功しているように見える)方法です。