未能覆盖setter& window.location的getter

时间:2016-10-01 19:43:34

标签: javascript aop getter-setter overrides

我想更改分配给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的设置者?

2 个答案:

答案 0 :(得分:2)

Javascript属性can be definedconfigurable: false表示无法重新定义它们。

尝试重新定义此类属性将导致如下错误:

Uncaught TypeError: Cannot redefine property: location

出于安全原因,预计主机对象上的属性不可配置。

您可以通过检查属性描述符来验证这一点:

Property descriptor for 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");