我想更改分配给window.location
的所有链接。所以我认为location
有吸气剂和放大器二传手。这就是我克隆它的原因。然后我覆盖真实的window.location
:
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
NOT /go
。
但实际行为是此脚本重定向到/go
==>因此,window.location
setter未被覆盖,
如何覆盖window.location
的设置者?
答案 0 :(得分:2)
Javascript属性can be defined让configurable: false
表示无法重新定义它们。
尝试重新定义此类属性将导致如下错误:
Uncaught TypeError: Cannot redefine property: location
出于安全原因,预计主机对象上的属性不可配置。
您可以通过检查属性描述符来验证这一点:
答案 1 :(得分:0)
你习惯用另一个可以实现钩子(前后)的静态类来包装window.location:
查看kaop
Aspects.add(
function op1(){
console.log("operation one");
var argument0 = meta.args[0];
if(typeof argument0==='string'){
argument0=argument0+'?id=1';
}
},
function op2(){
console.log("operation two");
}
)
var DummyLocation = Class({
set: ["op1", function(newUrl){
location = newUrl;
}, "op2"],
get: [function(){
return location;
}]
})
现在你应该使用:
DummyLocation.set("/go");