it-swarm.com.de

Ist JavaScript objektorientiert?

Es gab einige Fragen, ob JavaScript eine objektorientierte Sprache ist oder nicht. Sogar eine Aussage, "nur weil eine Sprache Objekte hat, macht es nicht zu OO."

Ist JavaScript eine objektorientierte Sprache?

55
ScottKoon

IMO (und es ist nur eine Meinung) das Schlüsselmerkmal einer objektorientierten Sprache wäre, dass es Polymorphismus unterstützen würde . Das machen so ziemlich alle dynamischen Sprachen.

Das nächste Merkmal wäre Kapselung und das ist auch in Javascript ziemlich einfach zu tun.

In den Köpfen vieler ist es jedoch inheritance (insbesondere Implementierungsvererbung), das den Ausschlag gibt, ob eine Sprache als objektorientiert bezeichnet werden kann.

JavaScript bietet eine recht einfache Möglichkeit, die Implementierung über Prototyping zu erben, dies geht jedoch zu Lasten der Kapselung.

Wenn Ihr Kriterium für die Objektorientierung also der klassische Dreier aus Polymorphismus, Einkapselung und Vererbung ist, besteht Javascript nicht.

Edit : Es wird die Zusatzfrage aufgeworfen: "Wie opfert die prototypische Vererbung die Verkapselung?" Betrachten Sie dieses Beispiel eines nicht-prototypischen Ansatzes:

function MyClass() {
    var _value = 1;
    this.getValue = function() { return _value; }
}

Das _value-Attribut ist gekapselt und kann nicht direkt durch externen Code geändert werden. Wir könnten der Klasse einen Mutator hinzufügen, um sie auf eine Weise zu ändern, die vollständig durch Code gesteuert wird, der Teil der Klasse ist. Betrachten Sie nun einen prototypischen Ansatz für dieselbe Klasse:

function MyClass() {
  var _value = 1;
}
MyClass.prototype.getValue = function() { return _value; }

Na das ist kaputt. Da die getValue zugewiesene Funktion mit _value nicht mehr im Gültigkeitsbereich liegt, kann sie nicht darauf zugreifen. Wir müssten _value auf ein Attribut von this heraufstufen, aber das würde den Zugriff außerhalb der Kontrolle des für die Klasse geschriebenen Codes ermöglichen, daher ist die Kapselung fehlerhaft.

Trotzdem bleibt mein Votum, dass Javascript objektorientiert ist. Warum? Weil ich ein OOD gegeben habe, kann ich es in Javascript implementieren.

53
AnthonyWJones

Die kurze Antwort lautet Ja. Für mehr Informationen:

Aus Wikipedia :

JavaScript ist stark objektbasiert. Objekte sind assoziative Arrays, die durch Prototypen ergänzt werden (siehe unten). Objekteigenschaftsnamen sind assoziative Array-Schlüssel: obj.x = 10 und obj ["x"] = 10 sind äquivalent, wobei die Punktnotation lediglich syntaktischer Zucker ist. Eigenschaften und ihre Werte können zur Laufzeit hinzugefügt, geändert oder gelöscht werden. Die Eigenschaften eines Objekts können auch über eine for ... in-Schleife aufgezählt werden.

Siehe auch diese Artikelserie about OOP mit Javascript.

36
Eli Bendersky

Javascript ist eine Multiparadigmasprache, die prozedurale, objektorientierte (prototypbasierte) und funktionale Programmierstile unterstützt.

Hier ist ein Artikel wie zu tun OO in Javascript.

24
jop

Sprachen müssen sich nicht genau wie Java verhalten, um objektorientiert zu sein. Alles in Javascript ist ein Objekt; Vergleichen Sie mit C++ oder früheren Java-Versionen, die in gewissem Maße als objektorientiert gelten, aber immer noch auf Primitiven basieren. Polymorphismus ist in Javascript kein Problem, da es sich überhaupt nicht um Typen handelt. Die einzige Kernfunktion OO, die von der Syntax nicht direkt unterstützt wird, ist die Vererbung. Diese Funktion kann jedoch problemlos implementiert werden, wenn der Programmierer dies möchte. hier ist ein solches Beispiel.

19
Eevee

JavaScript ist objektorientiert, aber keine klassenbasierte objektorientierte Sprache wie Java, C++, C # usw. Klassenbasiert OOP Sprachen sind eine Teilmenge der größeren Familie von OOP Sprachen, zu denen auch prototypbasierte Sprachen wie JavaScript und Self gehören.

10
munificent

Ja und nein.

JavaScript ist, wie Douglas Crockford es ausdrückt, " die am meisten missverstandene Programmiersprache der Welt ". Er hat einige großartige Artikel über JavaScript , die ich unbedingt empfehlen würde, zu lesen, was genau JavaScript ist. Es hat mehr mit LISP gemeinsam, dass C++.

10
David Mohundro

JavaScript ist eine prototypbasierte Programmiersprache (wahrscheinlich ist eine prototypbasierte Skriptsprache eine korrektere Definition). Es wird geklont und nicht vererbt. Eine prototypbasierte Programmiersprache ist ein Stil der objektorientierten Programmierung ohne Klassen. Während objektorientierte Programmiersprachen den Entwicklungsfokus auf Taxonomie und Beziehungen fördern, regen prototypbasierte Programmiersprachen dazu an, sich zuerst auf das Verhalten zu konzentrieren und es später zu klassifizieren.

Der Begriff „objektorientiert“ wurde 1967 von Alan Kay geprägt, der ihn 2003 als „objektorientiert“ bezeichnet

nur Nachrichtenübermittlung, lokale Aufbewahrung und Schutz und Verstecken von staatlichen Prozessen und extrem spätes Binden aller Dinge.  (Quelle)

Bei der objektorientierten Programmierung kann jedes Objekt Nachrichten empfangen, Daten verarbeiten und Nachrichten an andere Objekte senden.

Damit eine Sprache objektorientiert ist, können Merkmale wie Verkapselung, Modularität, Polymorphismus und Vererbung enthalten sein, dies ist jedoch keine Voraussetzung. Objektorientierte Programmiersprachen, die Klassen verwenden, werden oft als klassenbasierte Programmiersprachen bezeichnet, aber es ist keineswegs ein Muss, Klassen zu verwenden, um objektorientiert zu sein.

JavaScript verwendet Prototypen, um Objekteigenschaften einschließlich Methoden und Vererbung zu definieren.

Fazit: JavaScript IS objektorientiert.

8
Vefýsing

Im Gegensatz zu den meisten objektorientierten Sprachen hat JavaScript (jedenfalls vor ECMA 262 Edition 4) kein Klassenkonzept, sondern Prototypen. Als solches ist es in der Tat etwas subjektiv, ob man es objektorientiert nennt oder nicht.

@eliben: Wikipedia sagt Objekt - basiert . Das ist nicht dasselbe wie objektorientiert. Tatsächlich unterscheidet ihr Artikel über objektbasierte Sprachen zwischen objektorientierten Sprachen und prototypbasierten Sprachen, wobei JavaScript explizit aufgerufen wird und nicht . objektorientierter.

6
Sören Kuklau

JavaScript ist eine sehr gute Sprache, um objektorientierte Web-Apps zu schreiben. Es kann OOP unterstützen, da es die Vererbung durch Prototyping sowie Eigenschaften und Methoden unterstützt. Sie können über Polymorphismus, Kapselung und viele Unterklassen-Paradigmen verfügen.

3
CMS

Dies ist natürlich subjektiv und eine akademische Frage. Einige Leute streiten sich, ob eine OO Sprache Klassen und Vererbung implementieren muss, andere schreiben Programme, die Ihr Leben verändern. ;-)

(Aber wirklich, warum sollte eine OO Sprache Klassen implementieren müssen? Ich denke Objekte waren die Schlüsselkomponenten. Wie Sie sie erstellen und dann verwenden, ist eine andere Sache .)

2

es ist ein guter Thread. Hier sind einige Ressourcen, die ich mag. Die meisten Leute beginnen mit Prototypen, JQuery oder einer der Top-6-Bibliotheken (Mootools, ExtJS, YUI), die unterschiedliche Objektmodelle haben. Prototype versucht, das klassische O-O nachzubilden, wie die meisten Leute es sich vorstellen

http://jquery.com/blog/2006/08/20/why-jquerys-philosophy-is-better/

Hier ist ein Bild von Prototypen und Funktionen, auf die ich mich oft beziehe

http://www.mollypages.org/misc/js.mp ?

2
Gene T

Ich beantworte diese Frage aus einem anderen Blickwinkel.

Dies ist ein ewiges Thema, und wir könnten in vielen Foren einen Flammenkrieg eröffnen.

Wenn Leute behaupten, dass JavaScript eine OO Programmiersprache ist, weil sie OOD damit verwenden können, dann frage ich: Warum ist C keine OO Programmiersprache? Wiederholen Sie, Sie können OOD mit C verwenden, und wenn Sie sagten, dass C eine OO - Programmiersprache ist, sagten alle, dass Sie verrückt sind.

Wir könnten hier in sehr alten Büchern und Foren viele Referenzen zu diesem Thema platzieren, da dieses Thema älter ist als das Internet :)

JavaScript hat sich seit vielen Jahren nicht geändert, aber neue Programmierer möchten zeigen, dass JavaScript eine OO - Programmiersprache ist. Warum? JavaScript ist eine mächtige Sprache, aber keine OO Programmiersprache.

Eine Programmiersprache OO muss Objekte, Methoden, Eigenschaften, Klassen, Kapselung, Aggregation, Vererbung und Polymorphismus enthalten. Sie könnten all diese Punkte implementieren, aber JavaScript hat sie nicht.

Ein sehr anschauliches Beispiel: Beschreiben Sie in Kapitel 6 von "Objektorientiertes JavaScript" 10 Arten, "Vererbung" zu implementieren. Wie viele Arten gibt es in Java? Eins und in C++? Eins und in Delphi (Object Pascal)? Eins und in Objective-C? Eins.

Warum ist das anders? Da Java, C++, Delphi und Objective-C unter Berücksichtigung von OOP entwickelt wurden, jedoch nicht JavaScript.

Als ich ein Student war (1993), gab es an der Universität eine typische Hausarbeit: Implementieren Sie ein Programm, das mit einer OOD (objektorientiertes Design) in einer Nicht-OO-Sprache entworfen wurde. In diesen Zeiten war die gewählte Sprache C (nicht C++). Ziel dieser Vorgehensweise war es, den Unterschied zwischen OOD und OOP deutlich zu machen und zwischen OOP und Nicht-OOP-Sprachen zu unterscheiden.

Wie auch immer, es ist ein Beweis dafür, dass nicht alle Leute eine Meinung zu diesem Thema haben :)

Meiner Meinung nach ist JavaScript eine leistungsstarke Sprache und die Zukunft auf der Client-Seite!

2
angelcervera

Hanselminutes Folge 146 schaut auf OO Ajax. Es war eine gute Show und definitiv eine gute Show, um sich eine Meinung zu bilden.

1
Aaron Powell

Misko Hevery hat eine hervorragende Einführung in Google Tech Talk gegeben, in der er über Objekte in Javascript spricht. Ich habe festgestellt, dass dies ein guter Ausgangspunkt für Leute ist, die entweder die Verwendung von Objekten in Javascript in Frage stellen oder mit ihnen beginnen möchten:

1

Ist JavaScript objektorientiert?

Antwort: ja

Es hat Objekte, die Daten enthalten können, und Methoden, die auf diese Daten einwirken. Objekte können andere Objekte enthalten.

  • Es gibt keine Klassen, aber Konstruktoren, die genau das tun, was Klassen tun, einschließlich Container für Klassenvariablen und -methoden.
  • Es hat keine klassenorientierte Vererbung, aber es hat eine prototyporientierte Vererbung.

Die beiden Hauptarten zum Aufbau von Objektsystemen sind Vererbung (is-a) und Aggregation (has-a). JavaScript kann beides, aber aufgrund seiner Dynamik kann es bei der Aggregation in Excel verarbeitet werden.

Einige argumentieren, dass JavaScript nicht wirklich objektorientiert ist, weil es keine versteckten Informationen bietet. Das heißt, Objekte können keine privaten Variablen und privaten Methoden haben: Alle Mitglieder sind öffentlich.

Es stellt sich jedoch heraus, dass JavaScript-Objekte private Variablen haben können und private Methoden. (Klicken Sie hier, um herauszufinden, wie.) Natürlich verstehen dies nur wenige, da JavaScript die am häufigsten missverstandene Programmiersprache der Welt ist.

Einige argumentieren, dass JavaScript nicht wirklich objektorientiert ist, weil es keine Vererbung bietet. Es stellt sich jedoch heraus, dass JavaScript nicht nur die klassische Vererbung, sondern auch andere Wiederverwendungsmuster von Code unterstützt.

Quellen: http://javascript.crockford.com/javascript.html

0

Objekte in JavaScript erben direkt von Objekten. Was kann objektorientierter sein?

0
Pavel Feldman

Ich denke, wenn Sie den gleichen oder ähnlichen Entwurfsmustern wie eine echte OO= Sprache wie Java/C # folgen können, können Sie sie so ziemlich als OO Sprache bezeichnen. Einige Aspekte sind offensichtlich unterschiedlich, aber Sie können immer noch sehr gut etablierte OO Designmuster verwenden.

0
mattlant

JavaScript ist objektbasiert, nicht objektorientiert. Der Unterschied besteht darin, dass objektbasierte Sprachen keine ordnungsgemäße Vererbung unterstützen, wohingegen objektorientierte Sprachen dies tun.

Es gibt eine Möglichkeit, eine "normale" Vererbung in JavaScript zu erreichen ( Referenz hier ), aber das Grundmodell basiert auf Prototyping.

0
dsm

Technisch ist es eine Prototypsprache, aber es ist leicht, darin OO) zu schreiben.

0
Rik

Es ist objektorientiert, basiert jedoch nicht auf Klassen, sondern auf Prototypen.

0
Vasil

JavaScript ist keine objektorientierte Sprache, wie sie normalerweise in Betracht gezogen wird, hauptsächlich aufgrund des Mangels an wahrer Vererbung. Die DUCK-Typisierung ermöglicht eine semi-wahre Form von Vererbung/Polymorphismus zusammen mit dem Object.prototype, der die gemeinsame Nutzung komplexer Funktionen ermöglicht. Im Kern führt die fehlende Vererbung jedoch zu einem schwachen Polymorphismus, da die DUCK-Typisierung darauf besteht, dass ein Objekt mit denselben Attributnamen eine Instanz eines Objekts ist, als das sie nicht verwendet werden sollten. Das Hinzufügen von Attributen zu zufälligen Objekten transformiert die Basis ihres Typs auf eine Art und Weise.

0
bmeck

Ja ist es. Es werden jedoch nicht alle Funktionen unterstützt, die in einer objektorientierten Programmiersprache ohne Vererbung und Polymorphismus zu erwarten sind. Dies bedeutet jedoch nicht, dass Sie diese Funktionen nicht mit dem für die Sprache verfügbaren Prototyping-System simulieren können.

0
MikeJ

Die Microsoft Ajax Client Library vereinfacht die Implementierung von OO in Javascript. Sie unterstützt Inharitence und Schnittstellenimplementierung.

0
urini

Für mich persönlich ist die Hauptattraktion von OOP) Programmierung die Fähigkeit, in sich geschlossene Klassen mit unbelichtetem (privatem) Innenleben zu haben.

Was mich in Javascript zu keiner Zeit verwirrt, ist, dass Sie nicht einmal Funktionsnamen verwenden können, da Sie das Risiko eingehen, dass Sie denselben Funktionsnamen an einer anderen Stelle in einer der von Ihnen verwendeten externen Bibliotheken haben.

Obwohl einige sehr kluge Leute Workarounds dafür gefunden haben, ist es nicht seltsam, dass Javascript in seiner reinsten Form erfordert, dass Sie Code erstellen, der sehr unlesbar ist?

Das Schöne an OOP) ist, dass Sie Ihre Zeit damit verbringen können, über die Logik Ihrer App nachzudenken, ohne sich um die Syntax kümmern zu müssen.

0
Kokodoko

Alles in Javascript ist ein Objekt - Klassen sind Objekte, Funktionen sind Objekte, Zahlen sind Objekte, Objekte Objekte Objekte. Das Schreiben ist nicht so streng wie bei anderen Sprachen, aber es ist definitiv möglich, OOP JS.

0
matt lohkamp