Javascript 未能覆盖setter&;window.location的getter
我想更改分配给Javascript 未能覆盖setter&;window.location的getter,javascript,aop,getter-setter,overriding,Javascript,Aop,Getter Setter,Overriding,我想更改分配给窗口位置的所有链接。所以我假设location有getter和setter。这就是我克隆它的原因&然后我覆盖了真正的窗口 var clonedLocation=Object.assign({},window.location); Object.defineProperty( window, 'location', { get: function (f) { return clonedLoca
窗口位置的所有链接。所以我假设location
有getter和setter。这就是我克隆它的原因&然后我覆盖了真正的窗口
var clonedLocation=Object.assign({},window.location);
Object.defineProperty( window, 'location', {
get: function (f) {
return clonedLocation;
},
set:function(o){
if(typeof o==='string'){
o=o+'?id=1';
}
clonedLocation=o;
}
} );
};
当您写入时,预期的行为(如果重写完成)是:
window.location='/go';
脚本应该将您重定向到/go?id=1
而不是/go
但是,实际行为是该脚本重定向到/go
==>因此,窗口.位置
设置器没有被覆盖
如何覆盖window.location
?Javascript属性的setter,使其具有可配置:false
,表示无法重新定义
尝试重新定义此类属性将导致如下错误:
Uncaught TypeError: Cannot redefine property: location
出于安全原因,主机对象上的属性是不可配置的
您可以通过检查属性描述符来验证这一点:
您习惯于使用另一个静态类包装window.location,该类可以实现钩子(之前和之后):
研究
现在,您应该使用:
DummyLocation.set("/go");
实际上,作为一个宿主对象属性,它甚至不需要将其可配置属性设置为false
来表现不可预测的行为。是的-非常正确。与这个特定的问题并不相关,但是有一种通用的方法来检测属性是否可配置(主机对象也遵循哪些属性)有助于使用者代码使用反射来检测可配置性,而不必对所有主机对象进行特殊处理。
DummyLocation.set("/go");