Ich versuche, einige Benutzercripts in JavaScript zu schreiben, um mit Browsererweiterungen verwendet zu werden.In einem externen Skript definierte übergeordnete Funktionen
In einer Website versuchte ich, mit Object.defineProperty eine in einem externen Javascript definierte Funktion zu überschreiben. aber es scheint, dass dies das externe Skript bricht, weil andere Codes in den externen Skripten (die für die ursprüngliche Website essentiell sind) nicht so gut ausgeführt werden.
<html>
<head>
<!-- injected script, injected via Userscript -->
<script>
Object.defineProperty(window, 'originalFunction', { get: function() { return overridingFunction; } });
</script>
<!-- injection end -->
</head>
<body>
<script src="/external-javascript.js">
<script> originalFunction(); </script>
<script> anotherEssentialFunction(); </script>
</body>
</html>
und http://domain/external-javascript.js
sieht aus wie dieses“
...
function originalFunction() {
some codes here;
}
...
function anotherEssentialFunction() {
....
}
und dies wurde verhindert anotherEssentialFunction aus ausgeführt wird. In der Konsole sehe ich TypeError: can't redefine non-configurable property originalFunction
und ReferenceError: anotherEssentialFunction is not defined
Ist das in dieser Situation zu erwarten, oder sollte es anders sein Problem, das es verursacht, das hier nicht beschrieben wird? Wie kann ich ursprüngliche Funktion sicher außer Kraft setzen, ohne solch einen Fehler zu verursachen?
(I enthalten, obwohl Anführungszeichen, bearbeitet, danke für den Hinweis auf vergaß) Es scheint, dass Wenn ich 'window.originalFunction = overridingFunction' verwende, wird die ursprüngliche Funktion vom externen Skript neu definiert, und dies war der Grund für mich, Getter zu verwenden. In meiner Situation wird die ursprüngliche Funktion tatsächlich in anderen Skripten im externen Skript mehrmals aufgerufen, aber ich dachte, sie sollten mit der neuen Überschreibungsfunktion arbeiten, oder vielleicht ist dies nicht wahr und ist die Ursache des Problems .. Ich werde es versuchen dein letzter Vorschlag. Vielen Dank! – user545
Ich habe versucht, wie Sie in der aktualisierten Antwort gesagt haben, und das entfernt einen Konsolenfehler 'TypeError: kann die nicht konfigurierbare Eigenschaft originalFunction nicht neu definieren. Allerdings ist 'anotherEssentialFunction' noch nicht definiert und ich würde gerne wissen, wie ich das beheben kann. – user545