Objekt instanziieren

JavaUncle

Mitglied
Problem: Douglas Crockford von Yahoo behauptet in seinem Buch "JavaScript - The Good Parts", das man ein Objekt nicht durch new instanziieren soll, weil dies ein Stilbruch des Prototypal Inheritance Konzeptes von JavaScript ist.

Daher möchte ich auf new verzichten.

Beispiel:

Code:
MeinPanel = {
	width : '100px',
	height : '200px',
	content : '',
	show : false,
	setVisible : function(show) {
		this.show = show;
	}
	setContent : function(content) {
		this.content = content;
	}
}

Wie erzeuge ich von MeinPanel nun mehrere Objekte, wenn ich mehrere Panels haben will?
 
Hi,

in deinem Beispiel handelt es sich um ein sogananntes Literal-Objekt (Object Literals). Da es sich hierbei bereits um ein erzeugtes Objekt handelt, ist das Instanziieren neuer Objekte daraus nicht mehr möglich.

Mir ist keine andere Möglichkeit als das Instanziieren über new bekannt, wenn neue Objekte instanziiert werden sollen.
Code:
function myPanel(){
  this.width = '100px';
  this.height = '200px';
  this.content = '';
  // ...
}
MeinPanel = new myPanel();
Vielleicht hilft dir das weiter.

Ciao
Quaese
 
new ist keine Option. Wenn eine Funktion mit dem new-Prefix aufgerufen wird, wird ein neues Objekt erstellt. Dieses hat einen versteckte Referenz auf den Wert des Prototype-Mitglieds der aufgerufenen Funktion, und this wird an das neue Objekt gebunden.

Der beste JavaScript-Guru der Welt (Douglas Crockford) rät dringend von new ab, da dies gegen das Konzept der Prototypal Inheritance von JavaScript geht. In JavaScript nach "Klassen" zu denken ist nicht Sinn der Sache, vor allem nicht bei so einer genialen Lambda-AI-Sprache. Er bezeichnet JavaScript auch als die meist misverstandene Programmiersprache der Welt. Zu Recht ;-)

Ich denke eine Lösung gefunden zu haben: Anstatt new wird ganz einfach eine Funktion aufgerufen und einer Variablen zugewiesen. Die Funktion selbst liefert einen Return-Wert, welcher ein Objekt-Literal ist. Nämlich dasjenige, was oben beschrieben wird.
 
Naja ich weiß ja nun nicht ob das alles so sinnvoll ist den new Operator ersetzen zu wollen oder zu behaupten das dieser das persofinizierte böse ist. Aber wie du so schön sagtest wird durch new ein neues Objekt erstellt. Das ist ja auch der Sinn des ganzen sonst würde man es ja nun nicht machen ;)

Ich mein auch die Google Leute arbeiten mit dem new Operator und als ganz blöde schätz ich die nun mal nicht ein , aber es heißt nun auch nicht das was die machen alles richtig ist.

Aber das mag eine persönliche Einstellungssache sein , ich selber arbeite mit JavaScript und stelle mir vor das sind nun Klassen und Objekte. Das klappt auch ziemlich gut möchte ich dazu sagen und anders würde ich auch nicht arbeiten wollen ;). Des weiteren nehme ich auch das prototype nicht mehr um eine Vererbung zu realisieren sondern bin auf apply und call umgestiegen , das erspart einen teilweise das Gefummel die Konstruktor Funktion nochmal aufzurufen weil man in der Elternklasse im Konstruktor mal eine ID generiert hat.

Man sieht die merkwürdigstens Konstrukte teilweise in JavaScript und jeder macht irgendwo was anderes.Das wichtigste ist a) es läuft und b) obendrein gut und c) man kann es noch nachvollziehen was dort abläuft.
 
Zuletzt bearbeitet:
Ja also das was Du meinst könnte man auch so schreiben dann

Code:
var meinefunc = (function () {
    var x = 1;
    var y = 2;
    // etc ...

    return {
        this.getNum1(){
        },
        this.getNum2(){
       }
    } 
})()

Dann hast nur noch ein Problem , das verhält sich ab jetzt wie ein Singleton Pattern. Du müsstest dann unterschiedliche set und get methoden haben und die würden dann die Variablen für alle gleichzeitig ändern.
Um einen new Operator kommt man erstmal nicht drum herrum in meinen Augen , zumindest wüsste ich nun auch keine Lösung und würde mir deine gern einmal ansehen dann.
 

Neue Beiträge

Zurück