JavaScript., Greasemonkey

Alles, was sonst nirgendwo reinpasst

JavaScript., Greasemonkey

Beitragvon C-Otto » 29.11.08 23:33

Hi,

Ich versuche mich seit geraumer Zeit an einem Greasemonkey-Skript. Nach anfaenglichen Probleme stosse ich inzwischen an die Grenzen des Moeglichen - wenigstens habe ich das Gefuehl.

Falls jemand Ahnung hat: Kann man den Code von Methoden in bereits existierenden Objektinstanzen aendern?

Situation:
Die Seite liefert Code fuer eine Funktion foo(), wobei innerhalb dieser Funktion mit lokalen Variablen nicht-statische Methoden definiert werden (this.x = function bar() {...}). Wenigstens habe ich das so verstanden.
Anschliessend wird eine Instanz erzeugt (var instance = new foo();) und durch einen Timer eine Funktion dieser Instanz wiederholt aufgerufen (instance.bar();).

Dummerweise macht bar() nicht das, was ich will. Es ist leider keine hilfreiche Loesung, den Code fuer foo() komplett zu kopieren und anzupassen (um eine neue Instanz zu erzeugen), da innerhalb von foo() auf diverse globale Variablen im Originalkontext zugegriffen wird, auf die ich innerhalb meines GM-Skripts nur kaum Zugriff habe.

Danke,
Carsten
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon cracki » 30.11.08 00:23

das objektmodell von js arbeitet mit prototypen. du solltest nur den prototypen (sprich die funktion, die als "klasse" herhaelt) aendern und die kinder ("objekte") aendern sich auch, falls sie die "vererbten" sachen nicht schon ueberschrieben haben.

magst du ein testfeld online stellen, wogegen man frickeln kann? sprich ne vereinfachung der seite, die du scripten willst?
"I suppose if what you said had any merit it would occasion hostility." -- Kenny Tilton
Frische Vorlesungen! -- video.rwth-aachen.de
Benutzeravatar
cracki
 
Beiträge: 537
Registriert: 22.02.08 14:51
Wohnort: Aachen
Studiengang: Informatik (M.Sc.)
Studiert seit: ?
Anwendungsfach: Medizin

Beitragvon C-Otto » 30.11.08 00:25

Ich erstelle gerade so ein Testbed. Dauert noch :)
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon AGo » 30.11.08 11:48

ich seh grad nich so ganz dein Problem. Du kannst (zumindest in JS; keine Ahnung ob GM da zusätzliche Restriktionen einführt, kann ich aber kaum glauben) deine Variablen immer zur Laufzeit ndern, das gilt auch für Funktionen. wenn du also deinem Objekt x mit x.foo = function() { } ne neue methode zuweist ist das kein Problem, solange du deine Finger vom Prototypen lässt.

Alternativ kannst du auch mit x.foo = eval("function() { alert('tukan') ; }") eine Funktion aus einem String generieren, falls dir das hilft.
Benutzeravatar
AGo
0x41476F
 
Beiträge: 2181
Registriert: 09.09.05 18:21
Wohnort: Awf
Studiengang: Informatik (Dipl.)
Anwendungsfach: BWL

Beitragvon C-Otto » 30.11.08 13:05

Genau. Man muss nur darauf achten, dass man in der neuen Methode den Code so schreibt, dass man auch an die "weit entfernten" globalen Variablen drankommt. Danke fuer die Hinweise hier und ueber sonstige Medien!
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon Michel » 05.12.08 20:57

Du kannst (zumindest in JS; keine Ahnung ob GM da zusätzliche Restriktionen einführt, kann ich aber kaum glauben) deine Variablen immer zur Laufzeit ndern, das gilt auch für Funktionen.


Das stimmt natürlich nicht ganz 100% ;)

Code: Alles auswählen
function MyClass()
{
   var constValue = 100;
   this.getConstValue = function()
   {
      return constValue;
   }
}
var myObject = new MyClass();


In diesem Beispiel ist constValue von außen nicht mehr änderbar (überlebt aber dank lexikalischem scoping). Man müsste erst einen setter schreiben.
Benutzeravatar
Michel
 
Beiträge: 40
Registriert: 19.03.08 14:15
Wohnort: Aachen

Beitragvon AGo » 06.12.08 12:20

Ich hab ja auch von handelsüblichen Variablen und nicht von pseudo-privaten Objekteigenschaften gesprochen :P
Benutzeravatar
AGo
0x41476F
 
Beiträge: 2181
Registriert: 09.09.05 18:21
Wohnort: Awf
Studiengang: Informatik (Dipl.)
Anwendungsfach: BWL


Zurück zu Off-Topic