理解できないコードがあります。
smjs で以下のコードを確認しました。false が返される理由がわかりませんでした。
プロトタイプ オブジェクトはインスタンスではありませんか?
js> "".__proto__
(new String(""))
js> (new String("")) instanceof String
true
js> "".__proto__ instanceof String
false
理解できないコードがあります。
smjs で以下のコードを確認しました。false が返される理由がわかりませんでした。
プロトタイプ オブジェクトはインスタンスではありませんか?
js> "".__proto__
(new String(""))
js> (new String("")) instanceof String
true
js> "".__proto__ instanceof String
false
これは基本的に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
プロパティが原因でそうではありません。