如何在JavaScript中覆盖location.assign或location.replace函数?

sun*_*sen 4 javascript

我试图覆盖该location.assign函数,以便我可以确保它设置的URL始终是绝对的.但我似乎无法让它工作:当我使用Xmlhttprequest.open如下,它工作正常:

var oldOpen;
oldOpen = XMLHttpRequest.prototype.open;

// override the native open()
XMLHttpRequest.prototype.open = function(){

    //Prepend our proxyURL
    arguments[1] = prependURL+arguments[1];

    // call the native open()
    oldOpen.apply(this, arguments);
}
Run Code Online (Sandbox Code Playgroud)

但是location.assign这种技术不起作用.这就是我正在尝试的:

var old;
old = window.location.assign.prototype.constructor;

window.location.assign.prototype.constructor = function(){
    console.log('dd');
    console.log(arguments);
            alert('ff');
}

old.apply(this,arguments);
Run Code Online (Sandbox Code Playgroud)

当我运行这个(我正在Chrome中进行测试)时,结果是Uncaught TypeError: Illegal invocation.如何覆盖location.assign以获得我想要的行为?

Pat*_*ark 8

根据assign规范不能修改该方法.请参阅WHATWG HTML Living Standard中Location界面.

您会注意到[Unforgeable]Location接口定义的扩展属性.这是在WebIDL中定义的:"它表示属性或操作将以某种方式反映为ECMAScript属性,这意味着其行为无法修改 ".请参阅[Unforgeable]W3C WebIDL编辑器的草稿.

在尝试修改replace在同一[Unforgeable]界面上定义的方法后,我发现此线程无济于事.


Ric*_*lly 0

window.location.assign是一个函数 - 您尝试访问的原型就是function原型。请尝试以下操作:

var old;
old = window.location.assign;

window.location.assign = function(){
  console.log('dd');
  console.log(arguments);
  alert('ff');
  old.apply(this, arguments);
}
Run Code Online (Sandbox Code Playgroud)