プロトタイプが手動で初期化された理由Nullがまだオブジェクトから継承されます

StackOverflow https://stackoverflow.com/questions/6300840

  •  22-10-2019
  •  | 
  •  

質問

私がこれを書くなら

var o = Object.create(null)
alert(o instanceof Object) // this is false

どうしてこれが真実になるのか

function o() {

}
o.prototype = null
alert(new o() instanceof Object) // this is true

プロトタイプを手動でnullに設定しては、オブジェクトのように何も継承しないようにするべきではありません。前もって感謝します :-)

役に立ちましたか?

解決

簡単に言えば、コンストラクターのプロトタイプがオブジェクトでない場合、インスタンスが与えられます object.prototype [プロトタイプ]]として。

詳細はECMA-262、§13.2.2[[construct]]にあります。

関数オブジェクトFの[[construct]]内部メソッドが、おそらく空の引数リストで呼び出される場合、次の手順を実行します。

  1. させて OBJ 新しく作成されたネイティブECMAScriptオブジェクトになります。
  2. のすべての内部方法を設定します OBJ 8.12で指定されています。
  3. [class]]内部プロパティを設定します OBJ に "物体".
  4. [拡張可能]]内部プロパティを設定します OBJ本当です.
  5. させて 原子 fの内部財産を引数で呼び出す価値がある」プロトタイプ".
  6. タイプの場合(原子)はオブジェクトです、[[プロトタイプ]]内部プロパティを OBJ原子.
  7. タイプの場合(原子)はオブジェクトではなく、[[プロトタイプ]]内部プロパティを設定します OBJ 15.2.4で説明されているように、標準の組み込みオブジェクトプロトタイプオブジェクトに。
  8. させて 結果 [[call]]内部財産を呼び出す結果です f, 、提供 OBJ として これ 値と引数リストの提供は[[construct]]に渡されました args.
  9. タイプの場合(結果)オブジェクトは戻ります 結果.
  10. 戻る OBJ.

項目6と7でそれに注目してください null タイプnull(ECMA-262§8.2)で、それは同じではありません typeof null, 、それです 物体.

他のヒント

あなたがそのようにそれをインスタンス化するとき、それはのオブジェクトを返します o.

その(隠された)プロトタイプチェーン まだ に指差す Object

Prototype

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top