Utilizzo corretto della parola chiave dell'interface JavaScript

Prima di tutto, no, non sto cercando di creare qualsiasi tipo di interface Java come il mio codice JavaScript. Ho visto queste domande dappertutto, e mentre io sono ancora un principiante relativamente al JavaScript, la mia mente ha ricoperto l'orrore appropriato (IMO) al pensiero.

Tuttavia, sono curioso di quanto sia l'uso effettivo interface . Ad esempio, Math è un'interface che contiene definizioni (ma non implementazioni). Credo (e possa essere del tutto sbagliato) che questi siano lì per fornire un mezzo per i definitori della lingua per imporre un insieme di comportmenti da attuare in vari motori JavaScript. È corretto?

Inoltre, ho la voglia di avere una "class statica" che contiene un sacco di methods di utilità. Mi piace che Math.sqrt (3) abbia un namespace esterno ('Math') che sia capitalizzato e un numero di methods e valori logicamente simili. Forse è solo il mio background Java / Ruby che mi fa venire voglia di un capitale sugli oggetti di raggruppamento. È quella ctriggers forma?

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

Un esempio puramente inventato, ma è anti-idiomatico nominare il "module" in questo modo?

Okay, così come con altre risposte, sai che l' interface di parole chiave non ha alcun vero caso di utilizzo nel mondo Javascript, ancora.

Il tuo esempio di math mi ha fatto sospetto che stai parlando di un model di progettazione, chiamato Module Pattern , ampiamente usato per scoprire il codice Javascript. Ci sono molti modi per rendere il codice modulare. Ad esempio proprio come OddDev ti ha risposto, il famoso model Prototype può incorporare il codice in modo modulare (proprio come l'esempio Math ). Ecco l'esempio Revealing Prototype Pattern con anche variables e funzioni private per una maggiore flessibilità:

 /* 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; })(); 

Ma non è tutto. Altre opzioni includono il model di module Scoped , il model del module POJO e molti altri. Date un'occhiata a come scrivere JavaScript modulati altamente scalabili e sostenibili , ha un insieme molto semplice e tuttavia completo di esempi.

Finora abbiamo parlato di un Javascript semplice. Se hai la possibilità di utilizzare le librerie nel tuo codice, allora un sorprendente insieme di librerie come Requjs , CommonsJS sono lì per aiutarti a questo con funzionalità fuori dal box . Date un'occhiata al post di Addy Osmani su Writing JavaScript modulare con AMD, CommonJS & ES Harmony .

La parola chiave interface in javascript è un FutureReservedWord , quindi non ha assolutamente nulla in questo momento, anche se ciò potrebbe cambiare nelle specifiche future. (Cfr. ECMAScript 5.1, sezione 7.6.1.2 ). Nel progetto ES6, questo è anche lo stesso.

Per quanto riguarda il module, questa è una soluzione perfettamente idiomatica. È sempre una buona idea per "spazio dei nomi" le tue funzioni, in quanto mantiene l'ambito globale il più ansible pulito.

Credo (e possa essere del tutto sbagliato) che questi siano lì per fornire un mezzo per i definitori della lingua per far rispettare una serie di comportmenti da attuare in vari motori JS. È corretto?

No, questo non è corretto. Cose come "Matematica" ecc. Sono oggetti contenenti funzioni. Se si utilizza per l'esempio "Math.pow (…)" è sufficiente eseguire la function memorizzata nell'object "Matematica". Controlla questo esempio:

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

var ShapeInspections = {isSymmetrical: function (s) {// determina se la forma è simmetrica}, numAngles: function (s) {// restituisce il numero di angoli}} Un esempio puramente inventato, ma è anti-idomatico call "module" in questo modo?

Va bene nominare i tuoi oggetti come questo. Come già discusso, "Matematica" è anche solo un object e segue queste convenzioni di denominazione.

Per rendere le cose chiare per la parola chiave dell'interface:

I seguenti gettoni sono considerati anche FutureReservedWords quando si verificano nel codice di modalità rigorosa (vedere 10.1.1). Il verificarsi di uno di questi token all'interno del codice di modalità rigorosa in qualsiasi context in cui il verificarsi di un FutureReservedWord genererebbe un errore deve anche generare un errore equivalente:

gli attrezzi consentono che il pacchetto di interface pubblica di resa privata sia protetto statico

È solo causa riservata che è "necessario" in futuro. Quindi non preoccuparti troppo di esso 🙂 http://www.ecma-international.org/ecma-262/5.1/#sec-7.6

Non confondere le "interfacce" specificate in IDL con la parola chiave interface .

Quest'ultimo è riservato a potenziali utilizzi futuri, ma non è ancora effettivamente utilizzato in ECMAScript (nemless in ES6).