Best Practices für objektorientiertes Javascript? [geschlossen]

251

Ich finde mich dabei, ein großes Projekt in Javascript zu programmieren. Ich erinnere mich, dass der letzte ein ziemliches Abenteuer war, weil hackiges JS schnell unlesbar werden kann und ich möchte, dass dieser Code sauber ist.

Nun, ich verwende Objekte, um eine Bibliothek zu erstellen, aber es gibt verschiedene Möglichkeiten, Dinge in JS zu definieren, was wichtige Konsequenzen für den Bereich, die Speicherverwaltung, den Namensraum usw. impliziert. EG:

  • verwenden varoder nicht;
  • Definieren von Dingen in der Datei oder in einem (function(){...})()Abfragestil;
  • Verwenden thisoder nicht;
  • mit function myname()oder myname = function();
  • Definieren von Methoden im Körper des Objekts oder Verwenden eines "Prototyps";
  • etc.

Was sind also wirklich die Best Practices beim Codieren in OO in JS?

Hier werden wirklich akademische Erklärungen erwartet. Link zu Büchern herzlich willkommen, solange es um Qualität und Robustheit geht.

EDIT:

Ich habe einige Lesungen erhalten, bin aber immer noch sehr an Antworten auf die oben genannten Fragen und an bewährten Methoden interessiert.

e-satis
quelle
2
Vielleicht sollte "objektorientiert" im Titel durch "modern" ersetzt werden.
viam0Zah
43
Hmmm, 79 positive Stimmen, 82 Favoriten, 91 positive Stimmen zur Antwort ... doch dies wurde als nicht konstruktiv geschlossen ... warum?
Brett Rossier
1
Ich habe eine einfache Klasse geschrieben, die C ++ OOP-Funktionen mit einer einfachen und natürlichen Syntax nach Javascript portiert. Siehe meine Antwort hier: stackoverflow.com/a/18239463/1115652
14
Diese Art von Frage wird immer geschlossen. Ich verstehe die Gründe dafür, aber da es sich um wichtige Fragen handelt, die immer beliebt sind (und da ich sie immer finde, wenn ich eine ähnliche Frage habe), frage ich mich, ob uns jemand an den richtigen Ort weiterleiten kann, um sie zu stellen.
KP MacGregor
2
@BrettRossier Was nützt Macht, wenn Sie sie nicht einsetzen? SO ist die Live-Demonstration, wie eine demokratische Hackordnung funktioniert. Sicherlich untersuchen einige Psychologen es ...

Antworten:

288

Verwenden von `var` oder nicht

Sie sollten jede Variable mit dem einfügen var Anweisung , da sie sonst in den globalen Bereich gelangt.

Es ist erwähnenswert, dass im strengen Modus ( "use strict";) nicht deklarierte Variablenzuweisungen ausgelöst werdenReferenceError .

Derzeit hat JavaScript keinen Blockbereich. Die Crockford-Schule lehrt Sie, var-Anweisungen am Anfang des Funktionskörpers zu platzieren , während Dojos Style Guide dies liest alle Variablen im kleinstmöglichen Umfang deklariert werden sollten . (Die letAussage und Definition in JavaScript 1.7 eingeführte ist nicht Teil des ECMAScript-Standards.)

Es wird empfohlen, die Eigenschaften regelmäßig verwendeter Objekte an lokale Variablen zu binden, da dies schneller ist als das Nachschlagen der gesamten Bereichskette. (Sehen Optimieren von JavaScript für extreme Leistung und geringen Speicherverbrauch .)

Definieren von Dingen in der Datei oder in einem `(function () {...}) ()`

Wenn Sie Ihre Objekte nicht außerhalb Ihres Codes erreichen müssen, können Sie Ihren gesamten Code in einen Funktionsausdruck einschließen - dies wird als Modulmuster bezeichnet. Es bietet Leistungsvorteile und ermöglicht es, Ihren Code auf hohem Niveau zu minimieren und zu verdecken. Sie können auch sicherstellen, dass der globale Namespace nicht verschmutzt wird. Durch das Umschließen von Funktionen in JavaScript können Sie auch aspektorientiertes Verhalten hinzufügen. Ben Cherry hat einen ausführlichen Artikel über das Modulmuster .

Verwenden von "dies" oder nicht

Wenn Sie die pseudoklassische Vererbung in JavaScript verwenden, können Sie die Verwendung kaum vermeiden this. Es ist Geschmackssache, welches Vererbungsmuster Sie verwenden. In anderen Fällen lesen Sie den Artikel von Peter Michaux über JavaScript-Widgets ohne "dies" .

Verwenden von `function myname ()` oder` myname = function (); `

function myname()ist eine Funktionsdeklaration und myname = function();ein der Variablen zugewiesener Funktionsausdruck myname. Das letztere Formular gibt an, dass Funktionen erstklassige Objekte sind und Sie mit ihnen alles tun können, wie mit einer Variablen. Der einzige Unterschied zwischen ihnen besteht darin, dass alle Funktionsdeklarationen an die Spitze des Bereichs gehoben werden, was in bestimmten Fällen von Bedeutung sein kann. Ansonsten sind sie gleich. function foo()ist eine Kurzform. Weitere Details zum Heben finden Sie im Artikel JavaScript Scoping and Hoisting .

Methoden im Objektkörper definieren oder "Prototyp" verwenden

Es liegt an dir. JavaScript verfügt über vier Objekterstellungsmuster: pseudoklassisch, prototypisch, funktional und Teile ( Crockford, 2008 ). Jeder hat seine Vor- und Nachteile, sehen Sie Crockford in seinen Videogesprächen oder holen Sie sich sein Buch The Good Parts, wie Anon bereits vorgeschlagen hat .

Frameworks

Ich schlage vor, Sie greifen auf einige JavaScript-Frameworks zurück, studieren deren Konventionen und Stil und finden die Praktiken und Muster, die am besten zu Ihnen passen. Zum Beispiel das Dojo Toolkit bietet beispielsweise ein robustes Framework zum Schreiben von objektorientiertem JavaScript-Code, der sogar Mehrfachvererbung unterstützt.

Muster

Schließlich gibt es einen Blog, der sich mit gängigen JavaScript-Mustern und Anti-Mustern befasst . Lesen Sie auch die Frage Gibt es Codierungsstandards für JavaScript? im Stapelüberlauf.

viam0Zah
quelle
1
"JavaScript hat vier Objekterstellungsmuster: pseudoklassisch, prototypisch, funktional und Teile" - ich würde eine Zusammenfassung der Vor- und Nachteile hier wirklich begrüßen.
BadHorsie
2
"Die letin JavaScript 1.7 eingeführte Anweisung und Definition ist nicht Teil des ECMAScript-Standards." Jetzt ist es Teil von ES6.
Michał Perłakowski
13

Ich werde einige Dinge aufschreiben, die ich gelesen oder in die Bewerbung aufgenommen habe, seit ich diese Frage gestellt habe. Die Leute, die es lesen, werden also nicht frustriert sein, da die meisten Antworten verkleidete RTMFs sind (auch wenn ich zugeben muss, dass vorgeschlagene Bücher gut sind).

Var Verwendung

Jede Variable soll bereits im höheren Bereich in JS deklariert sein. Wenn Sie also eine neue Variable möchten, deklarieren Sie sie, um böse Überraschungen wie die Manipulation einer globalen Variablen zu vermeiden, ohne sie zu bemerken.Verwenden Sie daher immer das Schlüsselwort var.

Variieren Sie in einem Objekt make die Variable private. Wenn Sie nur eine öffentliche Variable deklarieren möchten, verwenden Siethis.my_var = my_value dazu.

Methoden deklarieren

In JS gibt es zahlreiche Möglichkeiten, Methoden zu deklarieren. Für einen OO-Programmierer ist es am natürlichsten und effizientesten, die folgende Syntax zu verwenden:

Im Objektkörper

this.methodName = function(param) {

/* bla */

};

Es gibt einen Nachteil: Innere Funktionen können aufgrund des lustigen JS-Bereichs nicht auf "dies" zugreifen. Douglas Crockford empfiehlt, diese Einschränkung mit einer herkömmlichen lokalen Variablen namens "that" zu umgehen. So wird es

function MyObject() {

    var that = this;

    this.myMethod = function() {

        jQuery.doSomethingCrazy(that.callbackMethod);

    };

};

Verlassen Sie sich nicht auf das automatische Zeilenende

JS versucht, automatisch ;am Ende der Zeile hinzuzufügen , wenn Sie es vergessen. Verlassen Sie sich nicht auf dieses Verhalten, da Sie Fehler erhalten, die beim Debuggen ein Chaos sind.

e-satis
quelle
8

Lesen Sie zuerst etwas über die prototypbasierte Programmierung, damit Sie wissen, mit was für einem Biest Sie es zu tun haben, und werfen Sie dann einen Blick auf den JavaScript-Styleguide bei MDC und die JavaScript-Seite bei MDC . Ich finde es auch am besten, die Codequalität mit einem Tool zu erzwingen, dh. JavaScript Lint oder andere Varianten.

Best Practices mit OO klingen eher so, als ob Sie Muster finden möchten, als sich auf die Codequalität zu konzentrieren. Schauen Sie sich also die Google-Suche an: Javascript-Muster und jQuery-Muster .

Bleadof
quelle
5

Vielleicht möchten Sie Secrets of the JavaScript Ninja ausprobieren von John Resig (jQuery) ansehen. "Dieses Buch soll einen fortgeschrittenen JavaScript-Entwickler aufnehmen und ihm das Wissen vermitteln, das er benötigt, um eine browserübergreifende JavaScript-Bibliothek von Grund auf zu erstellen."

Der Entwurf ist über den Verlag erhältlich: http://www.manning.com/resig/

Douglas Crockford hat auch einige schöne JavaScript-Artikel auf seiner Homepage: http://www.crockford.com/

gregers
quelle
5

Ich fühle mich oft als der einzige hier, der MooTools für mein Javascript verwendet.

Es steht für M y O bject O riented Tools, mootools.

Ich mag ihre Einstellung zu OOP in Javascript sehr. Sie können ihre Klassenimplementierung auch zusammen mit jquery verwenden, sodass Sie jquery nicht loswerden müssen (obwohl mootools alles genauso gut macht).

Wie auch immer, lesen Sie den ersten Link gut durch und sehen Sie, was Sie denken. Der zweite Link führt zu den mootools-Dokumenten.

MooTools & Vererbung

MooTools-Klassen

Ryan Florence
quelle
Es ist keine gute Sache, eine Sprache so zu biegen, dass sie zu Ihrem alten Habbit passt. Es ist wie bei diesen Leuten in C, die # als Ersatz verwenden, damit es wie fortran aussieht, oder sonst. Ich denke, Sie sollten versuchen, die Funktionsweise der Sprache (und ihre Best Practicesà) zu lernen und sie so zu verwenden, dass Sie nicht zu sehr gestört werden. Aber ändern Sie sie nicht wirklich.
e-satis
2
Ich denke, das MooTools-Objektsystem ist ziemlich elegant und hilft mir wirklich, meinen Code organisiert / gekapselt zu halten.
Awesomo
0

Hier ist ein Buch, das die meisten Grundlagen abdeckt:

Objektorientiertes Javascript für hochwertige Anwendungen und Bibliotheken

Praveen Angyan
quelle
Danke, aber ich suche nicht nach der Basis. Ich kann (schmutzig) lauffähiges JS codieren. Oder zumindest die meiste Zeit :-) Ich brauche Anleitungen, um den gleichen Code zu schreiben, aber richtig.
E-