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/

第二行发生的事情是:

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