2016-10-01 21 views
0

Я хочу изменить все ссылки, назначенные на window.location. Поэтому я предполагаю, что location имеет геттер & сеттер. Вот почему я клонировал его & тогда я переопределять реальный window.location:не удается переопределить сеттер и getter of 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 НЕ /go ,

Однако фактическое поведение является то, что этот скрипт перенаправляет /go

==> Таким образом, window.location сеттера не был преодолен,

Как переопределить сеттер window.location?

+1

См http://stackoverflow.com/questions/2073086/javascript-how-to-intercept-window-location-change – guest271314

ответ

1

Свойства Javascript can be defined имеют configurable: false, что указывает на то, что они не могут быть переопределены.

Попытка пересмотреть такое свойство приведет к появлению ошибки:

Uncaught TypeError: Cannot redefine property: location 

Следует ожидать, что свойства на объектах хозяевах не настраивается по соображениям безопасности.

Вы можете убедиться в этом, проверив дескриптор свойства:

Property descriptor for location

+0

На самом деле, будучи * хозяин объекта * свойство он даже не нуждается в его 'конфигурируемый 'атрибут должен быть установлен на' false', чтобы действовать непредсказуемо. – Bergi

+0

Да - очень верно. Не имеет никакого отношения к этому конкретному вопросу, но, имея общий способ определить, является ли свойство настраиваемым (какие хост-объекты также придерживаются), помогает отражать потребительский код для определения конфигурации, а не для специального случая всех объектов хоста. – lorefnon

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