4

x私がテストしたほとんどの値について、次のように評価されtrueます。

Object.getPrototypeOf(x) === x.constructor.prototype

...しかし、いくつかの例外があります:xが文字列の場合、上記の式の LHS は次のようなエラーで失敗します

TypeError: "abc" is not an object

...ただし、たとえば、 に"abc".constructor.prototype評価されString.prototypeます。xが数値またはブール値の場合、類似の結果が得られます。

どうしたの?前に示した ID にさらに例外はありますか?

x.constructor.prototypeさらに重要なことに、上記はが よりも堅牢であることを示唆していObject.getPrototypeOf(x)ます。

排他的に使用せずx.constructor.prototype、完全に忘れる正当な理由はありObject.getPrototypeOf(x)ますか?

4

2 に答える 2

1

文字列 (およびその他のプリミティブ) は、少し奇妙な動作をすることがあります。

基本的に、プリミティブのプロパティにアクセスしようとすると、対応するオブジェクトを使用して Just-In-Time 方式でボックス化され、そのオブジェクトのプロパティが返されます。

したがって、この場合、 にアクセスしようとすると"abc".constructor、実際に起こっていることはnew String("abc").constructor(もちろんオブジェクトを返しStringます) と同じです。

一方、Object.getPrototypeOfそのようなボックス化は行わず、代わりに、オブジェクトではないものを渡すとエラーを返します。

あなたが示唆するx.constructor.prototypeように、この「ボクシング」ケースを処理するため、何かのコンストラクターを決定するより信頼できる方法のようです。とは言っても、個人的には、このようなものが必要になる可能性のある実際の状況は考えられません。なぜなら、通常、何かがどのタイプであるかはすでにわかっているからです。===これは、ほとんどの場合、使用することに実際の意味が見られないのと同じ理由です.

于 2013-09-02T22:42:58.810 に答える