すべてのオブジェクトがObjectを継承している訳じゃない
JavaScript におけるすべてのオブジェクトは Object に由来します。 すべてのオブジェクトは Object.prototype からメソッドとプロパティを継承しています が、それらは上書きされている可能性があります。
らしい、だけどオブジェクトの中にはObjectを継承していないものがある。
追記
優しい人に教えてもらったのだけど、IE8およびIE7はじゃなくてJavaScriptじゃなくてJScriptというJavaScript互換言語でスクリプトを実行している。なのでMDNに書かれていることは正しい。紛らわしいこと書いてごめんなさい。
追記終わり。
JScriptのオブジェクトの中にはObjectを継承していないものがある。
具体例を出すとIE7でのwindow
オブジェクトやDOM Events。
さらにIE7でのwindow.toString
はFunction
を継承していない。
alert(window instanceof Object); // IE7ではfalse
alert(window.toString instanceof Function); // IE7ではfalse
以下、どうしてこんなことになっているか調べた。
native object, built-in object, host object
JScriptの標準言語仕様であるECMAScriptによると、オブジェクトは3つに分類できる。
- native object
ホスト環境(つまりブラウザとかNode)から独立したオブジェクト。後述のbuilt-in objectと自分で作った(ユーザ定義した)オブジェクトがこれにあたる。
- built-in object
ECMASciriptで定義されているオブジェクト。すべてのbuilt-in objectはnative objectでもある。Object
やFunction
、Date
などおなじみのオブジェクトがこれ。
- host object
ホスト環境から提供されるオブジェクト。ブラウザでいうwindow
やDOM、Nodeでいうrequire
などがこれにあたる。
Objectの継承について
Unless otherwise specified every built-in prototype object has the Object prototype object, which is the initial value of the expression Object.prototype (15.2.4), as the value of its [[Prototype]] internal property, except the Object prototype object itself.
(てきとうな意訳)特に断りのない場合、すべてのbuilt-in prototype objectの[[Prototype]]
内部プロパティはObject.prototype
を初期値として持っている、とある。
つまり基本的に built-in object はObject
をプロトタイプ継承しているよ、ということだ。
でも、逆にbuilt-in object以外についてはObject
を継承する、ということが明記されていない。
つまり?
built-in object以外はObjectを継承していなくても、ECMAScriptの仕様上間違いではないので host object であるwindow
などはObjectを継承していなくてもよい。
すべてのオブジェクトがObject
を継承しているだろうと思って、うっかりIE7で
// IE7
document.getElementById('btn').attachEvent('onclick', function (e) {
if (e.hasOwnProperty('target')) {
// 処理
}
});
とかやってしまうと、エラーになる(host objectであるEvent
がObject
を継承しておらずObject.prototype.hasOwnproperty
を参照しないため)。
関数についても同様のことがいえるので、IE7だと下記がエラーになる。
var obj = {};
window.toString.call(obj); // Functionを継承していないのでFunction.prototype.callを使えない
まとめ
host objectがObject
を継承してるかどうかは実行環境の実装によるので、気をつけよう。。
Author And Source
この問題について(すべてのオブジェクトがObjectを継承している訳じゃない), 我々は、より多くの情報をここで見つけました https://qiita.com/osakanafish/items/60d020f34a1442989def著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .