問題は、それa
がプリミティブな値であることです。オブジェクトではありません。プロパティをオブジェクトにのみ割り当てることができます。プリミティブな値ではありません。
プロパティをプリミティブ値に割り当てようとすると、JavaScript はすぐにそれをオブジェクトに強制します。例えば:
var x = true; // x is primitive
x.y = false; // x is coerced to an object
alert(x.y); // y is undefined
ここでデモを参照してください: http://jsfiddle.net/UtYkA/
2行目で起こっていることは次のとおりです。
new Boolean(x).y = false; // x is not the same as new Boolean(x)
x
はオブジェクトに強制され、プロパティy
がこのオブジェクトに追加されるため、それ自体にはプロパティが追加されていませんx
。
同じことがすべてのプリミティブ (JavaScript のブール値、数値、文字列) に当てはまります。print(a.prop)
これが常に出力される理由です5
-a
はプリミティブであり、オブジェクトではありません。
アクセスしようとすると、毎回同じオブジェクトではなく、オブジェクトa.prop
に強制されます。a
したがって、JavaScript は次のように扱います。
var a = 6;
new Number(a).constructor.prototype.prop = 5;
print(new Number(a).prop);
new Number(a).prop = 4; // assigning prop to an object which is discarded
print(new Number(a).prop); // accessing prop from an object which has no prop
詳細については、次の回答をお読みください: https://stackoverflow.com/a/15705498/783743