1

ファイアバグコンソールで:

>>> a=12 
12
>>> a.__proto__
Number {}
>>> (12).__proto__
Number {}
>>> a.constructor.prototype === (12).__proto__
true
>>> a.constructor.prototype.isPrototypeOf(a)
false

最後の行は、他の行と比較して大きな混乱を引き起こします。プロトタイプチェーンにないConstructor.prototypeも参照してください。

4

3 に答える 3

2

演算子をプリミティブで使用する.と、言語は適切なオブジェクト型 (この場合は数値) でそれを自動ボックス化します。これは、JavaScript の単純なプリミティブ型が実際には Object インスタンスではないためです。

したがって、実際の左辺

a.__proto__

数ではありません12があくまでも目安new Number(12)です。ただし、変数「a」は引き続き単純な数値です12

編集仕様のセクション 8.7では、これを典型的な ECMA 262 月の言語で「説明」しています。プリミティブbaseValueが Number、Boolean、または String インスタンスとして扱われる方法を説明する明確な段落が見つかりませんが、そのセクションはそれを直接暗示しています。これらの非プリミティブな合成値は一時的なものであるため ( .or[]式が評価されている間だけ「本物」である)、仕様では、実際の Number が構築されることを明示的に要求することなく、動作について話しているだけだと思います。しかし、私はそれについて推測しています。

于 2013-03-29T14:27:25.740 に答える
1

@Pointyはそれを非常によく説明しています。基本的に、最後のステートメントを真にしたい場合は、次のように記述する必要があります。

a.constructor.prototype.isPrototypeOf(new Number(a));
于 2013-03-29T14:37:14.870 に答える
0

JavaScript プリミティブでは、プロトタイプ チェーンがありません。オブジェクトのみが行います。プリミティブ値には次が含まれます。

  1. ブール値
  2. 数字
  3. ストリングス
  4. ヌル
  5. 未定義

したがってisPrototypeOf、プリミティブ値で呼び出すと、常に が返されfalseます。

ブール値、数値、または文字列をオブジェクトとして使用しようとすると、JavaScript によって自動的にオブジェクトに変換されます。したがって、舞台裏でa.constructor評価されます。new Number(a).constructorこれが、プリミティブ値をオブジェクトとして使用できる理由です。

プリミティブ値を格納する変数をオブジェクトとして頻繁に使用する場合は、明示的にオブジェクトにすることをお勧めします。たとえば、あなたの場合、aas として定義する方が良いでしょうnew Number(12)。利点は次のとおりです。

  1. JavaScript は、プリミティブをオブジェクトとして使用しようとするたびに、プリミティブをオブジェクトに強制する必要はありません。オブジェクトは 1 回だけ作成します。したがって、パフォーマンス効率が高いです。
  2. あなたの場合のメソッドは、のインスタンスになるようisPrototypeOfに返さtrueれます。したがって、プロトタイプチェーンに含まれます。aNumberNumber.prototype
于 2013-03-29T14:40:37.503 に答える