1

理解できないコードがあります。
smjs で以下のコードを確認しました。false が返される理由がわかりませんでした。
プロトタイプ オブジェクトはインスタンスではありませんか?

js> "".__proto__
(new String(""))
js> (new String("")) instanceof String
true
js> "".__proto__ instanceof String
false
4

1 に答える 1

4

これは基本的にArray.prototype を学習してその長さを計算するのと同じです。

String.prototype 仕様、§15.5.4、文字列プロトタイプ オブジェクトのプロパティによる、文字列です。

String プロトタイプ オブジェクト自体は、値が空の String である String オブジェクト (それ[[Class]]は です) です。"String"

String プロトタイプ オブジェクトの internal プロパティの値[[Prototype]]は、標準の組み込み Object プロトタイプ オブジェクト ( 15.2.4 ) です。

ただし、コンストラクター関数のインスタンスではありませんString

instanceofインスタンスのプロトタイプをprototypeコンストラクター関数のプロパティと比較することによって機能します ( §15.3.5.3 )、つまり

Object.getPrototypeOf(String.prototype) === String.prototype

String.prototypeしたがって、それが独自のプロトタイプであるかどうかをテストしています。これはもちろんfalseです。のプロトタイプString.prototypeは、仕様に記載されているように、Object.prototypeです。


最初の例に関する言葉:

> js> "".__proto__
 (new String(""))

コンソール (または RELP) はヒューリスティックを使用して値をフォーマットおよび表示することに注意してください。たとえばconstructor、オブジェクトのプロパティを読み取って、その値の「種類」を判断し、それに応じて出力をフォーマットする場合があります。それが Chrome コンソールが行っていることです。

var str = new String('foo');
str instanceof String
=> true
console.dir(str);
=> String

var obj = {};
console.dir(obj);
=> Object                   // looks good

obj.constructor = String;
=> console.dir(obj); 
String                      // uhm what?
obj instanceof String
=> false

すべてのプロトタイプ オブジェクトが、constructorそのプロトタイプ オブジェクトである関数を指すプロパティを持っている場合があります。

function Foo() {}
Foo.prototype.constructor === Foo;
=> true
console.dir(Foo.prototype)
=> Foo

そのため、プロトタイプ オブジェクトをログに記録すると、オブジェクトが関数自体のインスタンスであることが出力で示唆される場合がありますが、constructorプロパティが原因でそうではありません。

于 2013-06-22T15:01:21.603 に答える