In Javascript gibt es einige klar hervorgehobene Techniken zum Erstellen und Verwalten von Klassen / Namespaces in Javascript.
Ich bin gespannt, welche Situationen es rechtfertigen, eine Technik gegen die andere einzusetzen. Ich möchte einen auswählen und dabei bleiben, um vorwärts zu kommen.
Ich schreibe Unternehmenscode, der von mehreren Teams verwaltet und gemeinsam genutzt wird, und ich möchte wissen, was die beste Vorgehensweise beim Schreiben von wartbarem Javascript ist.
Ich bevorzuge normalerweise selbstausführende anonyme Funktionen, bin jedoch gespannt, wie die Community über diese Techniken abstimmt.
Prototyp :
function obj()
{
}
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();
Selbstschließende anonyme Funktion:
//Self-Executing Anonymous Function
(function( skillet, $, undefined ) {
//Private Property
var isHot = true;
//Public Property
skillet.ingredient = "Bacon Strips";
//Public Method
skillet.fry = function() {
var oliveOil;
addItem( "\t\n Butter \n\t" );
addItem( oliveOil );
console.log( "Frying " + skillet.ingredient );
};
//Private Method
function addItem( item ) {
if ( item !== undefined ) {
console.log( "Adding " + $.trim(item) );
}
}
}( window.skillet = window.skillet || {}, jQuery ));
//Public Properties
console.log( skillet.ingredient ); //Bacon Strips
//Public Methods
skillet.fry(); //Adding Butter & Fraying Bacon Strips
//Adding a Public Property
skillet.quantity = "12"; console.log( skillet.quantity ); //12
//Adding New Functionality to the Skillet
(function( skillet, $, undefined ) {
//Private Property
var amountOfGrease = "1 Cup";
//Public Method
skillet.toString = function() {
console.log( skillet.quantity + " " +
skillet.ingredient + " & " +
amountOfGrease + " of Grease" );
console.log( isHot ? "Hot" : "Cold" );
};
}( window.skillet = window.skillet || {}, jQuery ));
//end of skillet definition
try {
//12 Bacon Strips & 1 Cup of Grease
skillet.toString(); //Throws Exception
} catch( e ) {
console.log( e.message ); //isHot is not defined
}
Ich denke, ich sollte erwähnen, dass die selbstausführende anonyme Funktion das vom jQuery-Team verwendete Muster ist.
Update
Als ich diese Frage stellte, sah ich nicht wirklich, wie wichtig es war, was ich zu verstehen versuchte. Die eigentliche Frage ist, ob Sie new verwenden oder nicht, um Instanzen Ihrer Objekte zu erstellen, oder um Muster zu verwenden, für die keine Konstruktoren erforderlich sind, bzw. um das new
Schlüsselwort zu verwenden.
Ich habe meine eigene Antwort hinzugefügt, da wir meiner Meinung nach Muster verwenden sollten, bei denen das new
Schlüsselwort nicht verwendet wird .
Weitere Informationen finden Sie in meiner Antwort.
quelle
Antworten:
Selbstausführende anonyme Funktionen werden verwendet, um die Skriptausführung zu automatisieren, ohne externe Ereignisse (z. B. window.onload) zu berücksichtigen.
In diesem Beispiel wird es verwendet, um das klassische Modulmuster zu bilden, dessen Hauptzweck darin besteht, einen Namespace in die globale Umgebung einzufügen und eine Kapselung für interne Eigenschaften bereitzustellen , die nicht "exportiert" oder an den Namespace angehängt werden.
Das Ändern eines Objektprototyps wird dagegen zum Einrichten der Vererbung (oder zum Erweitern von Natives) verwendet. Dieses Muster wird verwendet, um 1: n-Objekte mit gängigen Methoden oder Eigenschaften zu erstellen.
Sie sollten nicht ein Muster dem anderen vorziehen , da diese unterschiedliche Aufgaben ausführen . In Bezug auf den Namespace ist die Self Executing Function eine geeignete Wahl.
quelle
Hier ist das Muster, mit dem ich gerade angefangen habe (ich habe bis gestern Variationen davon verwendet):
Ein paar Gedanken dazu:
(anonymous)
Ablaufverfolgungen in den Ablaufverfolgungen Ihres Debugger-Stacks erhalten, da alles benannt ist (keine anonymen Funktionen).Die einzige Zeit, die ich wirklich nutzen würde,
prototype
ist die Definition der Vererbung.quelle
function clone(obj){return this typeof 'clone' ? this : new clone(clone.prototype=obj)}
prototype
von Ihnen vorgeschlagenen Methode ist (es sei denn, es gibt eine mir unbekannte Methode), dass Sie die Fähigkeit verlieren, Attribute zu kapseln, was bedeutet, dass alles öffentlich ist (was nicht das Ende der Welt ist) , nur eine persönliche Präferenz).Ich verwende Prototypen, weil sie sauberer sind und Standardvererbungsmustern folgen. Selbstaufrufende Funktionen eignen sich hervorragend für die Browserentwicklung oder für Situationen, in denen Sie nicht wissen, wo der Code ausgeführt wird, ansonsten jedoch nur Rauschen.
Beispiel:
quelle
Ich würde mit der selbstausführenden Funktion gehen, aber mit einem kleinen Unterschied:
Wenn Sie diesen Ansatz viel sauberer finden, trennen Sie die zurückgegebene globale Variable von allen Eingabeparametern (wie z. B. jQuery) (die Art und Weise, wie Sie sie geschrieben haben, entspricht der Rückgabe von void und der Verwendung eines ref-Parameters in C # Zeiger an Zeiger übergeben und in C ++ neu zuweisen). Wenn ich dann zusätzliche Methoden oder Eigenschaften an die Klasse anhängen würde, würde ich eine prototypische Vererbung verwenden (Beispiel mit der $ .extend-Methode von jQuery, aber es ist einfach genug, Ihre eigene extend () zu rollen):
Auf diese Weise können Sie klar zwischen den hinzugefügten und den ursprünglichen Methoden unterscheiden.
quelle
Live-Beispiel
Sie können ein IIFE verwenden, um "Modulbereich" um Ihren Code zu emulieren. Dann können Sie Objekte wie gewohnt verwenden.
"Emulieren" Sie nicht den privaten Status mithilfe von Closures, da dies einen großen Speicherbedarf mit sich bringt.
Wenn Sie eine Unternehmensanwendung schreiben und die Speichernutzung unter 1 GB halten möchten, sollten Sie keine unnötigen Verschlüsse zum Speichern des Status verwenden.
quelle
console
und globalconsole
ist eine mikrooptimierung. Es lohnt sich, dies zu minimieren,console
aber das ist eine andere SacheUpdate Ich verstehe Javascript jetzt viel besser und habe das Gefühl, dass ich die Frage richtig beantworten kann. Ich denke, es war ein schlecht formuliertes, aber sehr wichtiges Javascript-Thema.
Das Muster "Selbstausführende anonyme Funktion" erfordert nicht die Verwendung des neuen Schlüsselworts, wenn Sie die Verwendung dieses außerhalb von Funktionen vermeiden. Ich stimme der Idee zu, dass die Verwendung von Neu eine alte Technik ist und wir uns stattdessen bemühen sollten, Muster zu verwenden, die die Verwendung von Neu vermeiden.
Die selbstausführende anonyme Funktion erfüllt diese Kriterien.
Die Antwort auf diese Frage ist subjektiv, weil es in Javascript so viele Codierungsstile gibt. Aufgrund meiner Forschung und Erfahrung würde ich jedoch empfehlen, die selbstausführende anonyme Funktion zu verwenden, um Ihre APIs zu definieren und die Verwendung neuer zu vermeiden, wann immer dies möglich ist.
quelle
Hier ist , wie ich über diese gehen würde
IIFE
SelfExecutingFunction
das verlängernMyclass
mitMyclass.anotherFunction()
;quelle