456 Stimmen

Verfügt JavaScript über einen Schnittstellentyp (wie z. B. Java's 'interface')?

Ich lerne wie man OOP mit JavaScript macht . Verfügt es über ein Schnittstellenkonzept (wie das von Java interface ) ?

Ich könnte also einen Hörer erstellen...

3voto

Mit einer Schnittstelle können Sie eine Art von Polymorphismus implementieren. Javascript macht NICHT brauchen den Schnittstellentyp, um diese und andere interface Sachen. Und warum? Javascript ist eine dynamisch typisierte Sprache. Nehmen Sie als Beispiel eine Reihe von Klassen, die die gleichen Methoden haben:

Circle()
Square()
Triangle()

Wenn Sie wissen wollen, wie Polymorphismus funktioniert, ist das Buch MFC von David Kruglinsky großartig (geschrieben für C++)

Implementieren Sie in diesen Klassen die Methode draw() schieben Sie die Instanzen dieser Klassen in das Array und rufen die draw() Methoden in einer Schleife, die das Array iteriert. Das ist vollkommen gültig. Man könnte sagen, Sie implementieren implizit eine abstract class . In der Realität ist es nicht da, aber in deinem Kopf hast du es getan und Javascript hat kein Problem damit. Der Unterschied zu einer echten Schnittstelle ist, dass Sie HAVE alle Methoden der Schnittstelle zu implementieren, und das ist in diesem Fall nicht erforderlich.

Eine Schnittstelle ist ein Vertrag. Sie müssen alle Methoden implementieren. Nur wenn man es statisch macht, muss man das tun.

Es ist fragwürdig, eine Sprache wie Javascript von dynamisch auf statisch umzustellen. Es ist nicht geeignet, statisch zu sein. Erfahrene Entwickler haben keine Probleme mit der dynamischen Natur von Javascript.

Der Grund für die Verwendung von Typescript ist mir also nicht klar. Wenn Sie NodeJS zusammen mit Javascript verwenden, können Sie extrem effiziente und kostengünstige Unternehmenswebsites erstellen. Die Kombination aus Javascript, NodeJS und MongoDB ist bereits ein großer Gewinn.

2voto

GalAbra Punkte 4796

Dies ist eine alte Frage, aber dieses Thema beschäftigt mich immer wieder.

Da sich viele der Antworten hier und im Internet auf die "Durchsetzung" der Schnittstelle konzentrieren, möchte ich eine alternative Sichtweise vorschlagen:

Ich spüre das Fehlen von Schnittstellen am meisten, wenn ich mehrere Klassen verwende, die sich ähnlich verhalten (z. B. eine Schnittstelle implementieren ).

Ich habe zum Beispiel eine E-Mail-Generator der erwartet, dass er E-Mail-Abschnitte Fabriken die "wissen", wie man den Inhalt der Abschnitte und HTML generiert. Daher müssen sie alle über eine Art von getContent(id) y getHtml(content) Methoden.

Das Muster, das den Schnittstellen am nächsten kommt (auch wenn es immer noch ein Workaround ist), ist die Verwendung einer Klasse, die 2 Argumente erhält, die die 2 Schnittstellenmethoden definieren werden.

Die größte Herausforderung bei diesem Muster ist, dass die Methoden entweder static oder um die Instanz selbst als Argument zu erhalten, um auf ihre Eigenschaften zuzugreifen. Es gibt jedoch Fälle, in denen ich diesen Kompromiss für lohnenswert halte.

class Filterable {
  constructor(data, { filter, toString }) {
    this.data = data;
    this.filter = filter;
    this.toString = toString;
    // You can also enforce here an Iterable interface, for example,
    // which feels much more natural than having an external check
  }
}

const evenNumbersList = new Filterable(
  [1, 2, 3, 4, 5, 6], {
    filter: (lst) => {
      const evenElements = lst.data.filter(x => x % 2 === 0);
      lst.data = evenElements;
    },
    toString: lst => `< ${lst.data.toString()} >`,
  }
);

console.log('The whole list:    ', evenNumbersList.toString(evenNumbersList));
evenNumbersList.filter(evenNumbersList);
console.log('The filtered list: ', evenNumbersList.toString(evenNumbersList));

2voto

Reinsbrain Punkte 1785

Javascript hat keine Schnittstellen. Aber es kann duck-typed werden, ein Beispiel finden Sie hier:

http://reinsbrain.blogspot.com/2008/10/interface-in-javascript.html

2voto

Tom Punkte 1008

Ich weiß, dass dies ein altes Thema ist, aber ich habe in letzter Zeit festgestellt, dass ich mehr und mehr eine praktische API für die Überprüfung von Objekten gegen Schnittstellen benötige. Also habe ich dies geschrieben: https://github.com/tomhicks/methodical

Es ist auch über NPM verfügbar: npm install methodical

Im Grunde tut es alles, was oben vorgeschlagen wurde, mit einigen Optionen, um ein bisschen strenger zu sein, und alles, ohne eine Menge von if (typeof x.method === 'function') Kesselstein.

Hoffentlich findet sie jemand nützlich.

2voto

uki Punkte 19

Js hat keine Schnittstellen, aber Typescript schon!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X