2015-04-13 10 views
7

Erstens, nein, ich versuche nicht, irgendeine Art von Java-ähnliche Schnittstelle für meinen JavaScript-Code zu erstellen. Ich habe diese Fragen überall gesehen, und obwohl ich immer noch ein relativer Neuling für JavaScript bin, schreckte mein Verstand in (IMO) angemessenem Entsetzen über diesen Gedanken zurück.Korrekte Verwendung der JavaScript-Schnittstelle Schlüsselwort

Allerdings bin ich neugierig, was die eigentliche Verwendung des Schlüsselwortes interface ist. Zum Beispiel ist Math eine Schnittstelle, die Definitionen enthält (aber keine Implementierungen). I glaube, (und möglicherweise völlig falsch), dass diese gibt es ein Mittel für die Definierer der Sprache, um eine Reihe von Verhaltensweisen in verschiedenen JavaScript-Engines zu implementieren. Ist das korrekt?

Außerdem habe ich den Wunsch, eine "statische Klasse" zu haben, die eine Reihe von Hilfsmethoden enthält. Ich mag, dass Math.sqrt (3) einen äußeren Namespace ('Math') hat, der groß geschrieben ist, und eine Reihe von logisch ähnlichen Methoden und Werten darin. Vielleicht ist es nur mein Java/Ruby-Hintergrund, der mich dazu bringt, ein Kapital für die Gruppierungsobjekte zu wollen. Ist das eine schlechte Form?

var ShapeInspections = { 
    isSymmetrical: function (s) { 
    // determine if shape is symmetrical 
    }, 
    numAngles: function (s) { 
    // return the number of angles 
    } 
} 

Ein rein erfundenes Beispiel, aber ist es anti-idiomatisch, das "Modul" auf diese Weise zu benennen?

+0

IMHO das ist völlig in Ordnung, und ich benutze dieses Muster ziemlich oft. – meskobalazs

+1

Was 'interface' Schlüsselwort ?! Es ist für zukünftige Verwendung reserviert, aber selbst in ES6 hat es keine definierte Verwendung. – Alnitak

+0

Großbuchstaben bezeichnen Konstruktoren, verwenden Sie sie nicht. Oder benutze sie, aber möglicherweise zur Verwirrung anderer Entwickler. Ich verwende Großbuchstaben in Sammlungsfunktionen, um Sammlungen zu bezeichnen, aber ich bin komisch und es ist eine schlechte Übung. –

Antwort

6

Okay, so wie mit anderen Antworten, wissen Sie, dass das Schlüsselwort Schnittstelle hat keinen echten Anwendungsfall in Javascript Welt, noch nicht.

Ihre Math Beispiel hat mich suspicous, dass Sie über ein Design-Muster sprechen, genannt Modul Muster, die weithin für Scoping Javascript-Code.Es gibt viele Möglichkeiten, Ihren Code modular zu gestalten. Zum Beispiel, genau wie OddDev antwortete Ihnen, kann die berühmte Prototype Pattern Ihren Code in einer modularen Weise einbetten (genau wie Ihre Math Beispiel). Hier ist das Revealing Urmuster Beispiel mit auch privaten Variablen und Funktionen für zusätzliche Flexibilität:

/* Example from: 
    http://www.innoarchitech.com/scalable-maintainable-javascript-modules */ 
var myPrototypeModule = (function(){ 

    var privateVar = "Alex Castrounis", 
     count = 0; 

    function PrototypeModule(name){ 
    this.name = name; 
    } 

    function privateFunction() { 
     console.log("Name:" + privateVar); 
     count++; 
    } 

    PrototypeModule.prototype.setName = function(strName){ 
     this.name = strName; 
    }; 

    PrototypeModule.prototype.getName = function(){ 
     privateFunction(); 
    }; 

    return PrototypeModule;  
})(); 

aber das ist nicht alles. Andere Optionen umfassen Scoped Modul Muster, POJO Modul Muster und viele mehr. Werfen Sie einen Blick auf How to Write Highly Scalable and Maintainable JavaScript: Modules, es hat eine sehr einfache und dennoch gründliche Reihe von Beispielen.

Bisher haben wir über Javascript gesprochen. Wenn Sie die Möglichkeit nutzen Bibliotheken in Ihrem Code haben, dann erstaunliche Reihe von Bibliotheken wie Requirejs, CommonsJS sind Sie mit out-of-the-box Funktionalitäten auf diesem zu helfen. Werfen Sie einen Blick auf Addy Osmanis Post über Writing Modular JavaScript With AMD, CommonJS & ES Harmony.

+0

Ich werde auf jeden Fall den Castrounis Artikel überprüfen. Vielen Dank! – erich2k8

0

I believe (and may be totally wrong) that these are there to provide a means for the definers of the language to enforce a set of behaviors to be implemented in various JS engines. Is that correct?

Nein, das ist nicht korrekt. Dinge wie "Mathematik" usw. sind Objekte, die Funktionen enthalten. Wenn Sie zum Beispiel "Math.pow (...)" verwenden, führen Sie einfach die im Objekt "Math" gespeicherte Funktion aus. Überprüfen Sie folgendes Beispiel:

var Math = {}; 
Math.prototype.pow = function(){ 
alert("stuff"); 
} 

var ShapeInspections = { isSymmetrical: function (s) { // determine if shape is symmetrical }, numAngles: function (s) { // return the number of angles } } A purely contrived example, but is it anti-idomatic to name the "module" this way?

es schon okay, Ihre Objekte so zu nennen. Wie bereits besprochen, ist "Math" auch nur ein Objekt und folgt diesen Namenskonventionen.

Um die Dinge klar für die Schnittstelle Stichwort zu machen:

The following tokens are also considered to be FutureReservedWords when they occur within strict mode code (see 10.1.1). The occurrence of any of these tokens within strict mode code in any context where the occurrence of a FutureReservedWord would produce an error must also produce an equivalent error:

implements let private public yield interface package protected static

Es ist nur reserviert Weil es in der Zukunft benötigt „kann“. Also keine Sorge zu viel über sie :) http://www.ecma-international.org/ecma-262/5.1/#sec-7.6

3

Das interface Schlüsselwort in JavaScript ist ein FutureReservedWord, so dass es nichts tut, absolut gerade jetzt, obwohl das in der Zukunft Spezifikationen ändern kann. (Siehe ECMAScript 5.1, section 7.6.1.2). Im ES6-Entwurf ist dies ebenfalls der Fall.

Für Ihr Modul ist dies eine perfekte idiomatische Lösung. Es ist immer eine gute Idee, Ihre Funktionen mit einem Namespace zu versehen, da der globale Bereich so sauber wie möglich gehalten wird.

0

Verwechseln Sie nicht die "Schnittstellen", die in IDL mit dem Schlüsselwort interface angegeben sind.

Letzteres ist für eine mögliche zukünftige Verwendung reserviert, wird aber in ECMAScript noch nicht verwendet (nicht einmal in ES6).

Verwandte Themen