Eine art Pointer um auf objekte zu verweisen
Christian
- javascript
Gibt es soetwas oder ähnliches in Javascript?
Was ich suche ist ein weg, der es schaft einer Objekteigenschaft eine art referenz, oder wie es auch sonst heissen mag, zuzuweisen.
Soll heissen sobald ich was an pointerrefenzObjekteigenschaft was ändere sich auch die "orginal"objekteigenschaft ändert.
Vielleicht habe ich das jetzt was kompliziert ausgedrückt.
Also, gibt es Pointer oder referenzen in Javascript?
Hi,
Also, gibt es Pointer oder referenzen in Javascript?
in JavaScript gibt es eigentlich _nur_ Referenzen. Wobei hattest Du Probleme welcher Art?
Cheatah
Hi,
Also, gibt es Pointer oder referenzen in Javascript?
in JavaScript gibt es eigentlich _nur_ Referenzen. Wobei hattest Du Probleme welcher Art?
ich will von einer Variable aus den Wert einer anderen verändern.
Hi,
ich will von einer Variable aus den Wert einer anderen verändern.
das willst Du nicht. In Wahrheit möchtest Du Dich mit Rückgabewerten beschäftigen. "Echte" Variablen über andere solche zu verändern ist _nicht_ sinnvoll. Zumindest fällt mir kein Fall ein, der nicht auf extrem schlechten Programmierstil deutet.
Cheatah
Hi,
ich will von einer Variable aus den Wert einer anderen verändern.
das willst Du nicht. In Wahrheit möchtest Du Dich mit Rückgabewerten beschäftigen. "Echte" Variablen über andere solche zu verändern ist _nicht_ sinnvoll. Zumindest fällt mir kein Fall ein, der nicht auf extrem schlechten Programmierstil deutet.
LOL, doch das will ich und das brauche ich auch notgedrungenderweise.
Also ist es möglich oder nicht und wenn ja wie mache ich dies?
in C, perl etc. gibt es diese möglichkeit auch und dort kann sie ebenfalls sehr sinnvoll sein.
kleines bespiel (was ich meine)
x = 1
y = x(irgendein Operator der mir eine art referenz zu dieser variable gibt)
wenn ich nun den wert in y ändere, wird er auch gleichzeitig in x geändert, also
ist x = y = 1
bzw.
x = y = 2
usw.
also wenn du wissen solltest wie das geht dann sag mir biitteee wie ;)
Ich weiss aber worauf du hinaus willst, hatte ich auch schon von gehört (schlechter stil etc.)
gruß Christian
Hi,
LOL, doch das will ich und das brauche ich auch notgedrungenderweise.
das glaube ich Dir nicht.
Also ist es möglich oder nicht
In JavaScript ist alles, womit Du arbeitest, eine Referenz. Nur Variablen nicht. Überall wo es nötig sein kann, mit Referenzen zu arbeiten, passiert dies bereits. Bei Variablen ist es nicht nötig. Wenn es doch geht, weiß ich nicht wie - und will's auch gar nicht wissen.
in C, perl etc. gibt es diese möglichkeit auch
Ja, dort sind Referenzen nicht zwingend gegeben.
und dort kann sie ebenfalls sehr sinnvoll sein.
Nur aufgrund sprachlicher Unzulänglichkeiten. Übergib in Perl beispielsweise mal zwei Arrays an eine Funktion, ohne zu referenzieren ...
x = 1
y = x(irgendein Operator der mir eine art referenz zu dieser variable gibt)
wenn ich nun den wert in y ändere, wird er auch gleichzeitig in x geändert, also
In JavaScript ändere bitte einfach x.
Ich weiss aber worauf du hinaus willst, hatte ich auch schon von gehört (schlechter stil etc.)
Ja, nimm's Dir bitte zu Herzen :-)
Cheatah
gruss Christian,
kleines bespiel (was ich meine)
x = 1
y = x(irgendein Operator der mir eine art referenz zu dieser variable gibt)wenn ich nun den wert in y ändere, wird er auch gleichzeitig in x geändert, also
ist x = y = 1
bzw.
x = y = 2
...
also wenn du wissen solltest wie das geht dann sag mir biitteee wie ;)Ich weiss aber worauf du hinaus willst, hatte ich auch schon von gehört (schlechter stil etc.)
was Du moechtest ist in js automatisch fuer
objekte eingebaut, fuer deren ".constructor"-
eigenschaft folgende ausdruecke wahr sind:
- ([object].constructor == Object);
- ([object].constructor == Array);
bsp.:
alert("bsp.\t: [1,2,3]\n\ntype\t: "" + (typeof [1,2,3]) + ""\n\n[1,2,3].constructor == Array == " + ([1,2,3].constructor == Array) + "\n\n\nconstructor:\n" + [1,2,3].constructor.toString());
alert("bsp.\t: new Object()\n\ntype\t: "" + typeof(new Object()) + ""\n\nnew Object().constructor == Object == " + (new Object().constructor == Object) + "\n\n\nconstructor:\n" + new Object().constructor.toString());
die zuweisung eines solchen objekts ist, wie Cheata
schon sagte, _immer_eine_referenz_ - diese objekte
koennen also nicht so ohne weiteres vervielfaeltigt
werden;
fuer die primitiven datentypen "boolean", "number"
und "string" sowie fuer die "object"-typen mit den
konstruktoren "RegExp", "Date", "Error" gilt dies
nicht - "a = datentyp_1" und eine darauffolgende
zuweisung "b = a" wird "b" immer eine vollstaendige
kopie von "a" zuweisen;
funktionen sind ebenfalls von der von Dir gewuenschten
art der refernzierung ausgeschlossen, wenn Du versuchst,
eine funktion mehreren variablen zuzuweisen - ich habe
das gerade ausprobiert:
function fx() {
var fxCounter = 99;
var fyCounter = 11;
alert("private properties:\n\nfxCounter = " + fxCounter + "\n\n\nfyCounter = " + fyCounter);
}
var x = fx;
var y = x;
x();
y(); // bis hierher ist alles klar;
x = null; // referenz waere spaetestens hier weg, wenn es eine gaebe;
y(); // verhaelt sich wie ein aufruf von "fx()" - also keine referenz durch "x";
fx = null;// jetz gibt es auch kein original mehr;
//fx(); // alert: "fx() ist not a function" - sehr schoen;
y(); // verhaelt sich immer noch wie ein aufruf von "fx()";
// demnach wurde die funktion als kopie(y=x;) einer kopie(x=fx;) zugewiesen;
so - und hier mal der code meiner versuchsreihe:
<script type="text/javascript">
<!--
alert("bsp.\t: true\n\ntype\t: "" + (typeof true) + ""\n\ntrue.constructor == Boolean == " + (true.constructor == Boolean) + "\n\n\nconstructor:\n" + true.constructor.toString());
alert("bsp.\t: 1\n\ntype\t: "" + typeof(1) + ""\n\n(1).constructor == Number == " + ((1).constructor == Number) + "\n\n\nconstructor:\n" + (1).constructor.toString());
alert("bsp.\t: "1"\n\ntype\t: "" + (typeof "1") + ""\n\n"1".constructor == String == " + ("1".constructor == String) + "\n\n\nconstructor:\n" + "1".constructor.toString());
alert("bsp.\t: [1,2,3]\n\ntype\t: "" + (typeof [1,2,3]) + ""\n\n[1,2,3].constructor == Array == " + ([1,2,3].constructor == Array) + "\n\n\nconstructor:\n" + [1,2,3].constructor.toString());
alert("bsp.\t: new Object()\n\ntype\t: "" + typeof(new Object()) + ""\n\nnew Object().constructor == Object == " + (new Object().constructor == Object) + "\n\n\nconstructor:\n" + new Object().constructor.toString());
alert("bsp.\t: new Function("",";")\n\ntype\t: "" + typeof(new Function("",";")) + ""\n\nnew Function("",";").constructor == Function == " + (new Function("",";").constructor == Function) + "\n\n\nconstructor:\n" + new Function("",";").constructor.toString());
alert("bsp.\t: /\s/\n\ntype\t: "" + typeof(/\s/) + ""\n\n/\s/.constructor == RegExp == " + (/\s/.constructor == RegExp) + "\n\n\nconstructor:\n" + /\s/.constructor.toString());
alert("bsp.\t: new Date()\n\ntype\t: "" + typeof(new Date()) + ""\n\nnew Date().constructor == Date == " + (new Date().constructor == Date) + "\n\n\nconstructor:\n" + new Date().constructor.toString());
alert("bsp.\t: new Error()\n\ntype\t: "" + typeof(new Error()) + ""\n\nnew Error().constructor == Error == " + (new Error().constructor == Error) + "\n\n\nconstructor:\n" + new Error().constructor.toString());
alert("bsp.\t: Math\n\ntype\t: "" + typeof(Math) + ""\n\nMath.constructor == Math == " + (Math.constructor == Math) + "\n\n\nconstructor:\n" + Math.constructor.toString());
alert("bsp.\t: Function\n\ntype\t: "" + typeof(Function) + ""\n\nFunction.constructor == Function == " + (Function.constructor == Function) + "\n\n\nconstructor:\n" + Function.constructor.toString());
function getLogText(theObject) {
if ((theObject === null) || (typeof(theObject) == "undefined")) {
return typeof(theObject);
} else {
var logText = "";
var propertyName = "";
for (propertyName in theObject) {
logText += propertyName + " = " + theObject[propertyName] + "\n";
}
return logText;
}
}
var x,y;
// ASSIGNING == REFERENCING
// ASSIGNING == REFERENCING
//
// OBJECT
x = {value1:"irgendwas",value2:true,"value3":24};
y = x;
alert("x - logData:\n\n" + getLogText(x) + "\ny - logData:\n\n" + getLogText(y));
alert("y - logData:\n\n" + getLogText(y) + "\nx - logData:\n\n" + getLogText(x));
y.value3 = "ganzwasanderes";
y["value1"] = "irgendwasanderes";
y.value5 = new Object();
alert("Object: assigning == referencing:\n\nx - logData:\n\n" + getLogText(x) + "\ny - logData:\n\n" + getLogText(y));
alert("Object: assigning == referencing:\n\ny - logData:\n\n" + getLogText(y) + "\nx - logData:\n\n" + getLogText(x));
//
// ARRAY
x = [1,2,3];
y = x;
alert("x = [" + x.join(",") + "]\ny = [" + y.join(",") + "]");
y[2] = "aber";
y[3] = "hallo";
alert("Array: assigning == referencing:\n\nx = [" + x.join(",") + "]\ny = [" + y.join(",") + "]");
//
// ASSIGNING != REFERENCING
// ASSIGNING != REFERENCING
//
// FUNCTION
function fx() {
var fxCounter = 99;
var fyCounter = 11;
alert("private properties:\n\nfxCounter = " + fxCounter + "\n\n\nfyCounter = " + fyCounter);
}
var x = fx;
var y = x;
alert(getLogText(x));
alert(getLogText(y));
x();
y();
x = null;
alert(getLogText(x));
alert(getLogText(y));
y();
fx = null;
//fx();
alert(getLogText(fx));
alert(getLogText(y));
y();
//
// REGEXP
x = /\s/g;
y = x;
alert("x = " + x + "\ny = " + y);
x = "was anderes";
alert("RegExp: assigning != referencing:\n\nx = " + x + "\ny = " + y);
//y = /<([^>]*)>/;
//alert("RegExp: assigning != referencing:\n\nx = " + x + "\ny = " + y);
//
// DATE
x = new Date().toLocaleString();
y = x;
alert("x = " + x + "\ny = " + y);
x = "was anderes";
alert("Date: assigning != referencing:\n\nx = " + x + "\ny = " + y);
//y = "was anderes";
//alert("Date: assigning != referencing:\n\nx = " + x + "\ny = " + y);
//
// ERROR
x = new Error();
y = x;
alert("x = " + x + "\ny = " + y);
x = "was anderes";
alert("Error: assigning != referencing:\n\nx = " + x + "\ny = " + y);
//y = "was anderes";
//alert("Error: assigning != referencing:\n\nx = " + x + "\ny = " + y);
//-->
</script>
by(t)e by(t)e - peterS. - pseliger@gmx.net
--
sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)