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");