有人可以在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的“邪恶部分”吗?
答案 0 :(得分: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/
第二行发生了什么:
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