Kann ich das aber auch mit JSON und einem Objekt so bauen, so dass die Containerfunktion zum Objekt wird?
Wieso willst du das tun?
Diesen Trick mit »that« verwendet man, damit man die Methoden des Objektes als First-Class-Objekt übergeben kann, ohne das Objekt mit zu übergeben. Das passiert etwa beim Event-Handling, bei setTimeout oder sonstiger funktionaler Programmierung. Über die Closure hat die Methode dann immer noch Zugriff auf das ursprüngliche Objekt.
Im Beispiel, was du gepostet hast, ist dieser Trick noch nicht nötig, weil die Methode nicht anders als über objekt.methode() ausgeführt wird. In solchen Fällen zeigt »this« immer brav auf »objekt« und du kannst this ohne Probleme verwenden.
Die anderen Fälle habe ich hier beschrieben:
Methoden eigener Objekte in anderen Kontexten ausführen
Alternativlösungen zur Kontext-Problematik: bind() und bindAsEventListener()
bzw. in dem neueren Text
Organisation von JavaScripten: Objektverfügbarkeit und this-Kontext
Du kannst bei Objects ebenfalls eine Closure oder Binding verwenden, wenn du die Referenz auf die Instanz brauchst und funktional arbeiten willst.
Mit Closure - eine Funktion als Expression erzeugen, sofort ausführen, die Methode darin ist eine Closure:
var obj = (function () {
var obj = {
prop : 'foo',
method : function () { alert(obj.prop); }
};
return obj;
})();
setTimeout(obj.method, 1);
Mit Binding:
var obj = {
prop : 'foo',
method : function () { alert(obj.prop); }
};
setTimeout(obj.method.bind(obj), 1);
a = {
b:"abc",
that:this,
testThis: function() {
alert(this);
},
testThat:function() {
alert(this.that);
}
}
a.testThis(); // [object Object]
a.testThat(); // [object Window]
>
> Ich dachte, es müsste genau umgekehrt sein, weil "a.that" das this konserviert
Es konserviert ein this, und zwar das Objekt, zu dem this auflöste in dem Kontext, indem es aufgelöst wurde. Das ist bei obigem Code das globale Objekt window. Dieses zwischenzuspeichern ist i.d.R. unnötig.
> das this, was sich auf Container bezieht.
Du kannst nicht innerhalb eines Object-Literals einen Verweis auf das gerade erzeugte Object anlegen. Das kannst du natürlich im Nachhinein: `a.that = a`{:.language-javascript}. Aber welchen Zweck sollte das haben.
Wenn du die Bedeutung von this noch nicht verstanden hast, helfen auch folgende Texte:
<http://molily.de/js/organisation-instanzen.html>
<http://dmitrysoshnikov.com/ecmascript/chapter-3-this/>
Mathias