Hallo,
function Obj()
{
Obj.prototype.func = function() { };
this.func_2 = function() { };
}
var a1 = new Obj();
var a2 = new Obj();alert(
( a1.func === a2.func)
Was soll das zeigen? Ein Objekt ist mit sich selbst identisch, klar. Beim zweiten Konstruktor-Aufruf werden a1.func und a2.func mit demselben Objekt überschrieben. Ergo sind sie identisch, logisch. Das heißt aber nicht, dass die Zeile nur einmal ausgeführt wird.
ein Skript wird nur einmal übersetzt, dabei stößt der Übersetzer auf [Objekt].prototype und diese wird dann intern nicht innerhalb der Funktion ausgeführt, sondern einmal an das Objekt gebunden.
Das verstehe ich nicht. Ich kann .prototype.irgendwas beliebig oft während der Laufzeit überschreiben.
Das heißt vom Standpunkt des Javascript übersetzters ist diese Deklaration nicht innerhalb irgendeines Block.
Doch, sie wird so oft ausgeführt, wie ich den Konstruktor ausführe, wieso auch nicht?
Den prototype innerhalb des constructor zu definieren hat aber dann den Vorteil das man auf private Variabeln zugreifen kann.
Naja, eigentlich das ein Nachteil, denn es funktioniert nicht so, wie man denkt. Dein Beispiel abgewandelt:
function klasse (c) {
klasse.prototype.func = function closure () { alert(c); } ;
}
var a1 = new klasse(1);
a1.func();
var a2 = new klasse(2);
a2.func();
a1.func();
c ist hier eine private Eigenschaft, durch Closure ist sie in func verfügbar. Aber indem man über prototype geht, ändert man alle func-Methoden von allen Instanzen. Alle Instanzen haben dann eine func, die die Variablen des letzten Konstruktoraufrufs »einschließt«. Sprich, man kann auf die Weise nicht auf die privaten Eigenschaften der jeweiligen Instanz zugreifen.
Mathias