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