Namespacing
Marco
- javascript
Hallo
Mit Hilfe von http://www.dustindiaz.com/namespace-your-javascript/ habe ich versucht Namespaces in einem Javascript einzusetzen:
Namespace = {};
Namespace.Konstruktur = function(var) {
this.var = var;
this.methode = function() {
alert('method');
}
};
var obj = new Namespace.Konstruktor('abc');
obj.method();
Nun habe ich festgestellt, dass auch folgendes geht:
Namespace.var = 'abc'
Namespace.method()
Wie kann ich das umgehen? Ich möchte ja nicht dass man auch Namespace.var setzen kann...?
Viele Grüsse
Marco
Hello out there!
Ich möchte ja nicht dass man auch Namespace.var setzen kann...?
Genau das erreichst du aber mit 'this.var = var;
'.
Lass diese Zeile weg.
See ya up the road,
Gunnar
Hallo
Genau das erreichst du aber mit '
this.var = var;
'.
Lass diese Zeile weg.
Dann kann ich aber z.B. folgendes nicht mehr machen, was ich aber will:
alert(obj.var);
'. Und wenn ich das this. bei der Methode weglasse, dann kann ich auch obj.method() nicht mehr benutzen...
Gruss Marco
Namespace = {};
Namespace.Konstruktur = function(var) {
this.var = var;
this.methode = function() {
alert('method');
}
};var obj = new Namespace.Konstruktor('abc');
obj.method();
> Wie kann ich das umgehen? Ich möchte ja nicht dass man auch Namespace.var setzen kann...?
Hm ok ich weiß jetzt nicht was du mit dem "Namespace" in JavaScript anfangen willst, aber gut man muss ja nicht alles wissen. Na du musst dir überlegen, dass wenn du in der Konstruktor-Funktion this.var = var schreibst du auch von außen darauf zugreifen kannst. Das kannst du dann weglassen, das übergebend Argument var steht dir zur Laufzeit ständig zur Verfügung und ist eine private - Variable. Sie ist gegenüber der Außenwelt anbeschirmt, und nur im Objekt/Instanz verfügbar.
Grüße
Hallo
Hm ok ich weiß jetzt nicht was du mit dem "Namespace" in JavaScript anfangen willst, aber gut man muss ja nicht alles wissen. Na du musst dir überlegen, dass wenn du in der Konstruktor-Funktion this.var = var schreibst du auch von außen darauf zugreifen kannst. Das kannst du dann weglassen, das übergebend Argument var steht dir zur Laufzeit ständig zur Verfügung und ist eine private - Variable. Sie ist gegenüber der Außenwelt anbeschirmt, und nur im Objekt/Instanz verfügbar.
Das bedeutet also ich kann auch ohne die Zeile this.var = var immernoch mit obj.var darauf zugreifen?
Gruss Marco
Hallo,
Das bedeutet also ich kann auch ohne die Zeile this.var = var immernoch mit obj.var darauf zugreifen?
Nein. Ohne this.variable = variable; ist es keine öffentliche Eigenschaft.
Mathias
Hallo,
Ich verstehe dein Problem nicht.
Namespace = {};
Namespace.Konstruktur = function (variable) {
this.variable = variable;
this.methode = function () {
alert('method');
};
};
var obj = new Namespace.Konstruktur('abc');
obj.methode();
Wenn ich hier
Namespace.methode();
mache, dann gibts die Methode natürlich nicht.
Und was Namespace.variable angeht:
Namespace ist ein einfaches Object-Objekt, man kann ihm willkürlich Eigenschaften hinzufügen. Das hat aber keine negativen Auswirkungen, was ist daran schlimm? Vor allem hat Namespace.variable nichts mit obj.variable zu tun.
Mathias
Hallo,
Wenn ich hier
Namespace.methode();
mache, dann gibts die Methode natürlich nicht.
Stimmt, nur Namespace.var;
ist verfügbar.
Und was Namespace.variable angeht:
Namespace ist ein einfaches Object-Objekt, man kann ihm willkürlich Eigenschaften hinzufügen. Das hat aber keine negativen Auswirkungen, was ist daran schlimm? Vor allem hat Namespace.variable nichts mit obj.variable zu tun.
Damit zu tun hat es viellicht nichts, aber es stört mich dass ich auf einem untergeordneten Objekt Namespace.Konstruktor eine Variable var definieren kann und diese dann mit Namespace.var ansprechbar ist. Schliesslich will ich dass man zuerst ein Objekt erstellt und die Variable erst dann verfügbar ist.
Gruss Marco
Hallo,
es stört mich dass ich auf einem untergeordneten Objekt Namespace.Konstruktor eine Variable var definieren kann und diese dann mit Namespace.var ansprechbar ist.
Ist sie aber nicht! Wie kommst du darauf?
Namespace = {};
Namespace.Konstruktur = function (variable) {
this.variable = variable;
};
var obj = new Namespace.Konstruktur('abc');
alert(obj.variable); // abc
alert(Namespace.variable); // undefined
(Übrigens, var ist ein Schlüsselwort und kann nicht Bezeichner sein.)
Mathias
Hi,
es stört mich dass ich auf einem untergeordneten Objekt Namespace.Konstruktor eine Variable var definieren kann und diese dann mit Namespace.var ansprechbar ist.
Ist sie aber nicht! Wie kommst du darauf?
Namespace.variable = 'test';
alert(Namespace.variable); //ausgabe ist 'test'
Viele Grüsse
Marco
Ist sie aber nicht! Wie kommst du darauf?
[code lang=javascript]
Namespace.variable = 'test';
alert(Namespace.variable); //ausgabe ist 'test'
Das ist etwas völlig anderes, als du uns am Anfang gezeigt hast. Du kannst einem Objekt und Namespace ist ja eines, beliebige Eigenschaften hinzufügen und das tust du hier. Das ist im Prinzip eine Eigenschaft vom Type static wenn du so eine nicht brauchst, dann darfst du auch keine deklarieren.
Struppi.
gruss Marco,
Mit Hilfe von http://www.dustindiaz.com/namespace-your-javascript/
ich finde, die von Dustin Diaz vorgestellte loesung ist noch nicht
ganz ausgereift. zur erzeugung wasserdichter namespaces empfehle ich
den einsatz eines echten konstruktors, der nur minimal manipuliert
werden muss - guckst Du hier weiter unten unter "Singleton"-muster:
https://forum.selfhtml.org/?t=149031&m=967955
by(t)e by(t)e - peterS. - pseliger@gmx.net