我正在尝试定义一个名为userdata
的自定义属性,但对于像location.hash这样的对象,它不起作用,我通过两个警报调用得到了false, false
。
Object.defineProperty(Object.prototype, "userdata", {
value: false,
writable: true,
enumerable: true,
configurable: true
});
alert (location.hash.userdata);
location.hash.userdata = true;
alert (location.hash.userdata);
它是不可变的吗?
如果我定义自己的对象,即
var a = {};
a.userdata = true;
它将被正确设置,我无法理解为什么前一个例子不起作用
答案 0 :(得分:1)
由于userdata
的默认值为false
,因此第一个警报显示为false是正常的。
但是,location.hash.userdata = true;
肯定不会起作用,因为当您使用点表示法将location.hash
原始字符串视为对象时,它会将原始值包装在String
原始包装器中,然后将该包装器对象丢弃,因此它与执行new String(location.hash).userdata = true;
由于您无法执行location.hash = new String(location.hash)
,因此您必须将属性存储在另一个对象上,因为location.hash
始终是不可变的。