Klassenvariable kann nur durch neue Instanz angesprochen werden

C3000

Mitglied
Hi @ all

Ich habe eine Klasse Tab und eine Klasse Updater. In beiden Klassen gibt es ein Array/Enumerable das als Klassenvariable deklariert ist. Hier mal der Code:
Code:
var Updater = {
	methods: [],	
	add: function(method){
		this.methods.push(method);
		this.activ = setTimeout(function(){Updater.update();}, 300000);
	},
}
Code:
var Tab = Class.create();
Tab.prototype = {
	tabs: [],
	initialize: function(id, src, breiten){
        ...
        }
}
Durch Updater.methods.length kann ich auf das Array methods zugreifen. Jedoch kann ich nur auf das Array tabs zugreifen wenn ich new Tab().tabs.length mache. Bei Tab.tabs bringt er mir nur undefined. Elemente sind im Array enthalten, und wenn ich in der Methode initialize this.tabs.length ausgebe und 2 neue tabs gemacht habe dann kommt auch der wert 2 raus.

Ich hoffe mir kann da jemand helfen.
Vielen dank schon mal für eure Mühe.

MfG
 
Also ich versuche zu verstehen was du planst komm aber nicht so recht dahinter.Der wesentliche Unterschied ist den ich seh ist folgender.

Updater an sich ist direkt ein Objekt also keine Funktion wobei Funktion ja auch ein Object ist. Aber der wesentliche Unterschied ist halt

Code:
var Updater = new Object(); // oder halt var Updater = {};
     Updater['methods'] = new array();
     Updater['methods'].push('foobar');

alert(Updater.methods.length);

/* 
 * kann man auch so schreiben
 */
var Updater = {
    methods:new Array()
}
			
Updater.methods.push('Paul Panzer');
alert(Updater.methods.length);

Hier kann man das schön betrachten ,das Objekt Updater ist ein assoziatives Array es gibt keinen Konstruktor oder ähnliches.

Code:
var Tab = Class.create();
Tab.prototype = {
	tabs: [],
	initialize: function(id, src, breiten){
        ...
        }
}

Oki ich kann nun mit dem Class.create() nix anfangen , aber wenn dann würde ich es so schreiben.

Code:
var Tab = function () {}; // <-- das ist quasi der Constructor
Tab.prototype = {
    tabs: [],
    initialize: function(id, src, breiten){
    }
}

/* 
 * kann man ohne das Prototype auch so schreiben ist das selbe 
 * nur das wir die Klasse Tab2 nun nicht mehr erweitern sondern die Eigenschaft tabs gleich als
 * öffentliche Eigenschaft bereitgestellt haben und die Methode initialize als öffentliche Methode
 * bereitgestellt haben. Über prototype fügst Du quasi der Klasse Tab diese 2 später nachträglich 
 * hinzu nett um zum Beispiel um später noch eine feste Klasse zu erweitern durch Vererbung 
 * oder hinzufügen neuer Eigenschaften und Methoden sollten diese aber bereits fest stehen würde 
 * ich sie immer gleich reinschreiben macht es übersichtlicher wie ich finde.
 * bei new Object() wird das Prototype nicht funktionieren naja gut wenn wir nun schreiben würden 
 * var obj = {} obj.prototype = {} hätten wir nun 2 unterschiedliche Objekte angelegt.
 */
function Tab2 () {
  this.tabs = new Array();
  this.initialize = function (params) {
  }
}

alert (typeof Tab); // gibt function aus 
alert (typeof Tab.tabs); // gibt undefined aus 

alert (typeof Tab2); // gibt function aus 
alert (typeof Tab2.tabs); // gibt undefined aus 

var newTab = new Tab();
var newTab2 = new Tab2();
/* 
   nun hab ich Zugriff auf die öffentlichen Eigeschaften und Methoden
*/
alert(typeof newTab.tabs);
alert(typeof newTab2.tabs);

Es ist nen bissel schwer zu erklären , aber sie mal das new Obeject() oder auch {} als assoziatives Array an.
 
Zuletzt bearbeitet:
Danke für deine Hilfe.
Deine Ausführungen haben mich in Javascript schon sehr weiter gebracht. Allerdings habe ich es nun gelöst bekommen.

Und zwar habe ich in Tab:
Code:
var Tab = Class.create();
Tab.prototype = {
	tabs: [],
	initialize: function(id, src, breiten){
            Tab.tabs = [];
         ...
        }
}

P.S. Class.create() kommt aus Prototype. Dadurch wird initialize als Konstruktor genommen.

MfG
 

Neue Beiträge

Zurück