无法修改添加到Number.prototype的属性

时间:2013-04-07 07:11:42

标签: javascript

有人可以在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的“邪恶部分”吗?

1 个答案:

答案 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