Hier habe ich zwei Objekte gemacht; Einer hat Accessormethoden im Konstruktor, der andere im Prototyp. Warum sollte man eines von diesen über das andere wählen?
%Vor% Der ursprüngliche Unterschied besteht darin, dass die Implementierung von getSecret
und setSecret
in Ihrem ersten Beispiel ohne Prototyp auf jeder Instanz von spy1 liegt.
In Ihrem zweiten Beispiel sind die Funktionen auf dem Prototyp definiert, und alle Instanzen beziehen sich direkt auf sie, Sie können es testen:
%Vor% Beachten Sie auch, was @ T.J. Kommentiert, in Ihrem zweiten Beispiel, mit dem Prototyp, haben Sie keinen Zugriff auf die Constructor-Funktion Schließung, und dafür machen Sie eine window.secret
globale Variable.
Wenn Sie vorhaben, mit privilegierten Methoden zu arbeiten, ist die Erweiterung des Prototyps keine Option, sondern alle Methoden, die der Zugriff auf die im Rahmen der Konstruktorfunktion definierten Variablen muss innerhalb davon deklariert werden ...
Siehe auch: Closures .
In Ihrem ersten Beispiel erstellen Sie neue Funktionen für jede Instanz des Objekts, wenn Sie eine neue instanziieren. Im zweiten Fall wird nur eine einzige Kopie der Funktion erstellt, die von allen Instanzen verwendet wird.
Der zweite Weg kann Speicher sparen. Sie können auch die Verkettung von Prototypen verwenden, um die Vererbung zu implementieren.
Übrigens, Ihr zweites Beispiel wird nicht wie geschrieben funktionieren. Die Variable secret
in spy2
ist lokal für den Konstruktor. In den Funktionen setSecret
und getSecret
im Prototyp greifen Sie auf eine einzelne globale Variable zu.
Mit der zweiten Version erhalten Sie einen saubereren "Konstruktor".
Tags und Links javascript prototype