Я столкнулся с той же проблемой во время разработки Не отслеживать меня Google Пользовательский скрипт / расширение.
Важное примечание
К объекту window
в содержимом Chrome нельзя получить прямой доступ.
Я протестировал много методов, и надежный метод only внедряет код через динамически создаваемый тег сценария. Посмотрите этот ответ или исходный код моего расширения для получения дополнительной информации.
Я решил это с помощью Object.defineProperty
. С помощью этого метода вы можете определить свойство и указать информацию о дескрипторах метода получения, установки и свойства. В вашем случае:
Object.defineProperty(window, 'foo', {
value: function(){/*This function cannot be overridden*/}
});
Или, если вы хотите захватить переменную и использовать ее позже:
(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;}
});
})();
<ч />
В Chrome 17, используя V8 3.7.12.12 (но не в Chrome 16, используя V8 3.6.6.19), Объявления функций переопределяют дескрипторы свойств .
См http://jsfiddle.net/bHUag/
Обратите внимание, что эта ошибка кажется не применимой, когда объявление функции и метод дескриптора свойства находятся в одном и том же блоке. Это ложно, хотя. Эффект не виден, потому что объявления функций всегда оцениваются перед блоком кода. Итак, сначала вычисляется function foo(){}
, а затем остальная часть кода.
<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>