it-swarm.com.de

Hat JavaScript Klassen?

Ein Freund und ich hatten letzte Woche Streit. Er gab an, es gäbe keine JavaScript-Klassen.

Ich sagte, es gab, wie du sagen kannst var object = new Object()

Er sagt "da kein Wort class verwendet wird. Es ist keine Klasse."

Wer hat Recht?


Als eine Notiz; Für die Zukunft benötigen Sie eine prägnante Classy JS-Implementierung:

https://github.com/tnhu/jsface


Edit: Juli 2017

In ECMAScript 2015 eingeführte JavaScript-Klassen sind in erster Linie syntaktischer Zuwachs gegenüber der bereits vorhandenen prototypbasierten Vererbung von JavaScript. Die Klassensyntax führt kein neues objektorientiertes Vererbungsmodell für JavaScript ein. JavaScript-Klassen bieten eine viel einfachere und klarere Syntax zum Erstellen von Objekten und zum Umgang mit Vererbung.

- Mozilla ES6-Klassen: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Classes

61
Glycerine

Technisch ist die Aussage "JavaScript hat keine Klassen" richtig.

Obwohl JavaScript eine objektorientierte Sprache ist, ist es keine klassenbasierte Sprache - es ist eine Prototyp-basierte Sprache . Es gibt Unterschiede zwischen diesen beiden Ansätzen. Da es jedoch möglich ist, JavaScript als klassenbasierte Sprache zu verwenden, bezeichnen viele Leute (einschließlich ich) die Konstruktorfunktionen oft einfach als "Klassen".

88
Steve Harrison

Javascript ist eine objektorientierte Programmiersprache. 2015 wurden jedoch mit ECMA-Skript 6 Klassen eingeführt, die nun wie andere klassenbasierte Sprachen wie Java verwendet werden können. Wie der Benutzer codemagician in seinem Kommentar darauf hinweist, gibt es natürlich erhebliche Unterschiede zwischen der Funktionsweise von Klassen in js und Java oder anderen "klassenbasierten" Programmiersprachen.

Trotzdem ist es jetzt in js möglich, beispielsweise folgenden Code zu verwenden:

class Animal { 
  constructor(name) {
    this.name = name;
  }


class Dog extends Animal {
  speak() {
    console.log(this.name + ' barks.');
  }
}

Quelle: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

Das hat etwas mit klassischen Klassensprachen zu tun. Die Probleme sind immer noch die Browser-Unterstützung dieser neuen Technologie, die gerade erst am Anfang steht. Daher ist es immer noch nicht gut, es für Produktionen zu verwenden. Ich habe jedoch keinen Zweifel, dass dieses Problem schnell gelöst werden kann.

Daher bleibt die Frage, ob js aufgrund der Implementierung dieser neuen Funktionen zu einer klassenbasierten Programmiersprache geworden ist, oder bleibt es immer noch eine objektprototyporientierte Programmiersprache.

22
willy wonka

In Javascript ist fast alles eine object (Objekte können von anderen Objekten erben). Es hat keine classes im klassischen Sinne.

Sie können die meisten Funktionen der klassischen Klassendefinition/-instanziierung durch Funktionsprototyping reproduzieren.

8
ChristopheD

Hören Sie sich Douglas Crockfords Vortrag hier an:
http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-2

Er spricht Ihre Frage direkt in seiner Präsentation an: 

Das kontroverseste Merkmal der Sprache ist die Art der Vererbung, die sich radikal von allen anderen modernen Sprachen unterscheidet. Die meisten Sprachen verwenden Klassen - ich nenne sie "klassische Sprachen" - JavaScript nicht. JavaScript ist klassenfrei. Es verwendet Prototypen. Für Leute, die klassisch ausgebildet sind und die Sprache betrachten, gehen sie: Nun, das ist mangelhaft. Sie haben keinen Unterricht, wie können Sie etwas erreichen? Wie können Sie sicher sein, dass die Struktur Ihres Programms funktionieren wird? Und daran kommen sie nie vorbei. Aber es stellt sich heraus…

7

Mit "Sprache X hat Klassen" meinen Menschen normalerweise die Unterstützung objektorientierter Programmierung.

Ja, Javascript ist eine objektorientierte Sprache.

5

Wenn ich an Klassen denke, denke ich an Typen und die Tatsache, dass Klassen mir erlauben, neue Typen zu definieren. In js können Sie keine neuen Typen erstellen. Mit Prototypen kann man allerlei ausgefallene Sachen machen, aber die Tatsache, dass alles immer noch ein Objekt ist, macht die klassenlose Natur von Js zu Hause. Ich denke, dass Leute, die "Klasse" -Terminologie verwenden, wenn sie über js sprechen, die js als Prototypsprache und js als klassische Sprache noch mehr verwirren als der hässliche neue Operator. Kurz gesagt, nur weil js OO ist, bedeutet dies nicht, dass Klassen existieren müssen.

2
fthinker

Um die anderen Antworten hinzuzufügen, hat Javascript keine Klassen, obwohl ich langsam Anweisungen sehe, in denen es als etwas wie Klassen bezeichnet wird, aber ich glaube, das verwirrt das Problem.

JavaScript hat Prototypen, keine Klassen, aber sie erreichen dasselbe. Prototypen sind Objekte, die Objekte definieren, daher die Verwirrung. 

Ein Prototyp ist eine Darstellung eines privaten internen Status, den eine Klasse beispielsweise in Java verwalten würde. Anstatt diesen internen Status in eine Klasse zu setzen und eine Schnittstelle zum Manipulieren von Verhalten bereitzustellen, wie in Java, macht JavaScript die Datenstruktur für JavaScript-Programme verfügbar, die direkt bearbeitet werden können.

Dies ist die beste Beschreibung, die ich zu diesem Thema gefunden habe: Prototypen sind keine Klassen .

1
James Drinkard

Aus You-Dont-Know-JS Buch unter https://github.com/getify/You-Dont-Know-JS

Kapitel 4: Mischen von Klassenobjekten

...

JS hat einige klassenähnliche syntaktische Elemente (wie new und Instanceof) für einige Zeit und in letzter Zeit in ES6 einige Ergänzungen wie das Schlüsselwort class.

Aber bedeutet das, dass JavaScript tatsächlich Klassen hat? Schlicht und einfach: Nein

Ich werde hier keine anderen Teile kopieren und an anderen Stellen vorbeikommen, sondern ich empfehle Ihnen, kapitel 3 & kapitel 4 zu lesen und Beispiele auszuführen.

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch3.mdhttps: // github. de/getify/You-Dont-Know-JS/blob/master/this% 20% 26% 20object% 20prototypen/ch4.md

1
Alireza Fattahi

In einfachen Worten - ja. Alles, was Sie brauchen, ist der Babel.js-Transpiler, da alle Browser ihn außer Chrome-Browser nicht unterstützen. Eine JavaScript-Klasse ist eine Art Funktion. Klassen werden mit dem Schlüsselwort class deklariert. Wir verwenden eine Funktionsausdruckssyntax, um eine Funktions- und Klassenausdruckssyntax zu initialisieren, um eine Klasse zu initialisieren.

Hier ist ein Beispiel für eine JavaScript-Klasse, die die Funktion verwendet:

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100

1
Mandeep Kaur

Obwohl JavaScript keine Klassen vor ES6 hatte, konnte in ES5 klassenähnliches Verhalten implementiert werden, indem Objekte versiegelt wurden (wodurch Objekte nicht erweiterbar waren). In einem versiegelten Objekt können keine neuen Eigenschaften und Methoden hinzugefügt werden und Eigenschaften sind nicht konfigurierbar. Property values ​​kann noch gesetzt und gelesen werden. Ich sage klassenhaft, weil es einen Vorbehalt gibt. Die Methodendefinitionen eines versiegelten Objekts können noch geändert werden. Das liegt daran, dass Eigenschaftswerte noch festgelegt werden können, es sei denn, Sie ändern alle Methodeneigenschaften so, dass sie nicht schreibbar sind. An diesem Punkt haben Sie das Klassenverhalten mit ES5 ziemlich genau reproduziert.

0
Puneet Lamba