461 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

Amit Wagner Punkte 2871

Es gibt keine nativen Schnittstellen in JavaScript, Es gibt mehrere Möglichkeiten, eine Schnittstelle zu simulieren. Ich habe ein Paket geschrieben, das dies tut

Sie können die Implantation sehen aquí

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