2

誰かが JavaScript でのこの動作を説明してもらえますか?

var a = 6;
a.constructor.prototype.prop = 5;
print(a.prop);
a.prop = 4;
print(a.prop);

次に、ideone で実行します。

5
5

aそれ自体が であることは理解していますがnumber、その原型はobjectです。しかし、なぜこのような不一致が存在するのでしょうか? 確かに、これは複数のコーディング エラーの原因となる可能性があります。これは JavaScript の「悪の部分」と見なされますか?

4

1 に答える 1

4

問題は、それ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

于 2013-04-07T07:34:23.263 に答える