我正在尝试覆盖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);
}但对于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);当我运行这段代码(我在Chrome中进行测试)时,结果是Uncaught TypeError: Illegal invocation。我如何重写location.assign来获得我想要的行为?
发布于 2013-10-28 09:55:03
不能根据规范修改assign方法。请参阅WHATWG HTML生活标准中的The Location Interface。
您将注意到为Location接口定义的[Unforgeable]扩展属性。这是在WebIDL中定义的:“它指示属性或操作将以某种方式反映为ECMAScript属性,这意味着它的行为不能被修改()”。请参见W3C WebIDL编辑器草稿中的[Unforgeable]。
在尝试修改定义在同一个[Unforgeable]接口上的replace方法后,我发现了这个线程,但没有用。
发布于 2012-02-13 18:30:21
不同之处在于,XMLHttpRequest是一个构造函数,而location是已经构造好的。
您可以直接覆盖它:
var old_location_replace = location.replace;
location.replace = function(url) {
// ....
};我想我会尝试找到一种不同的方法来解决这个问题,而不是摆弄环境中内置对象的基本操作。例如,我根本不能保证上面的方法能够很好地跨浏览器工作(特别是,IE通常不会使“主机”函数和对象成为真正的JavaScript函数和对象,而这是工作所必需的)。
一种更好的方法是使用一个所有代码都可以调用的函数,该函数依次调用location.replace和location.assign。如果你试图拦截来自你不能控制的代码的调用,这显然是行不通的,但你必须仔细考虑这样做是否真的合适。
发布于 2012-02-13 18:29:15
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);
}https://stackoverflow.com/questions/9258866
复制相似问题