Zastavte spuštění funkce pomocí rozšíření Chrome

Setkal jsem se se stejným problémem při vývoji skriptu / rozšíření Don't track me Google User.

#Důležitá poznámkawindow k objektu v obsahovém skriptu Chrome nelze žádným způsobem přistupovat přímo.
Testoval jsem mnoho metod a jedinou Spolehlivou metodou je vložení kódu prostřednictvím dynamicky vytvořené značky skriptu. Podívejte se na tuto odpověď nebo do zdrojového kódu mého rozšíření pro více informací.

Vyřešil jsem to pomocí Object.defineProperty . Pomocí této metody můžete definovat vlastnost a specifikovat informace o getter, setter a deskriptorech vlastností. Ve vašem případě:

Object.defineProperty(window, 'foo', {
    value: function(){/*This function cannot be overridden*/}
});

Nebo, pokud chcete proměnnou zachytit a použít ji později:

(function() {
    var originalFoo = function(){/*Default*/};
    Object.defineProperty(window, 'foo', {
        get: function(){
            if (confirm('function logic')) return function(){/*dummy*/};
            else return originalFoo;
        },
        set: function(fn){originalFoo = fn;}
    });
})();
##Chyba v Chromu 17 [Chyba #115452](http://code.google.com/p/chromium/issues/detail?id=115452) [Opraveno!](http://code.google.com/p/chromium/issues/detail?id=115452#hc4) V Chrome 17, který používá V8 3.7.12.12 (ale ne v Chrome 16, používající V8 3.6.6.19), **Deklarace funkcí přepisují deskriptory vlastností**.
Viz http://jsfiddle.net/bHUag/
Všimněte si, že tato chyba *zdá se*, že se nepoužije, když jsou deklarace funkce a metoda deskriptoru vlastnosti ve stejném bloku. To je ovšem falešné. Efekt není viditelný, protože deklarace funkcí jsou vždy vyhodnocovány před blokem kódu. Nejprve se tedy vyhodnotí `funkce foo(){}` a poté zbytek kódu.
<script>
Object.defineProperty(window, 'foo', {value: function(){return 5;} });
</script><script>
function foo(){return 1};
alert(foo()); // Shows 5 in all browsers except for Chrome v17
</script>