Chiusure JS - Passando una funzione a un bambino, come si dovrebbe accedere all'oggetto condiviso

2

Ho un design e mi sto chiedendo quale sia il modo appropriato per accedere alle variabili. Dimostrerò con questo esempio poiché non riesco a descriverlo meglio del titolo.

  • Term è un oggetto che rappresenta un gruppo di dati temporali (una durata di tempo ripetuta definita da un gruppo di attributi)
  • Term ha alcune funzionalità di stampa ma non implementa le funzioni di stampa, ma vengono passate come funzioni anonime dal genitore. Questo sarebbe simile a come gli shader possono essere passati a un renderer piuttosto che definiti dal renderer.
  • Un contenitore (chiamiamolo Box ) ha un oggetto Schedule che può comprendere e utilizzare oggetti Term .
  • Box crea Term oggetti e li passa a Schedule come richiesto. Box definisce anche le funzioni print memorizzate in Term .
  • Una funzione print di solito prende un argomento e lo usa per restituire una stringa basata su quell'argomento e i dati interni di Term . A volte la funzione print potrebbe anche utilizzare i dati memorizzati in Schedule , però. Sto chiamando questo dato shared .

Quindi, la domanda è, qual è il modo migliore per accedere a questo shared di dati. Ho molte opzioni dal momento che JS ha delle chiusure e non conosco abbastanza bene per sapere se dovrei usarle o evitarle in questo caso.

Opzioni:

  1. Crea un "riferimento" locale (termine usato con leggerezza) ai dati shared (i dati non sono primitivi) quando definisci la funzione print accedendo ai dati shared fino a Schedule da Box . Esempio:

    var schedule = function(){
        var sched = Schedule();
        var t1 = Term( function(x){   // Term.print()
                           return  (x + sched.data).format();
                     });
    };
    
  2. Collegalo esplicitamente a Term . (Passalo nel costruttore di Term o qualcosa del genere). Oppure associalo in Sched dopo che Box lo ha passato. E poi accedervi come un attributo di Term .

  3. Inseriscilo nello stesso momento in cui x viene passato alla funzione di stampa, (da sched). Questo è il modo più familiare per il mio, ma non mi sembra giusto data la capacità di chiusura di JS.
  4. Fai qualcosa di strano come bind un po 'di contesto e argomenti a print .

Spero che la risposta corretta non sia puramente soggettiva. Se lo è, suppongo che la risposta sia "fai tutto ciò che funziona". Ma sento che ci sono alcune differenze significative tra gli approcci che potrebbero avere un grande impatto quando si estendono oltre il mio piccolo esempio.

Modifica

Pubblicherò la soluzione che sto usando, ma vorrei ancora esprimere critiche:

Tutte le funzioni print prendono, come argomenti, tutto ciò che term non possiede. In questo modo, term non è accoppiato a schedule in alcun modo (ovviamente schedule dipende ancora da term , comunque). Ciò consente a term di essere inizializzato / costruito ovunque senza bisogno di conoscere la pianificazione.

Quindi, se term ha una funzione init() , potrebbe richiedere un oggetto simile a questo:

{
    inc: moment.duration(1,"d"),
    periods: 3,
    class: "long",
    text:"Weekly",
    pRange: moment.duration(7,'d'),
    //*...other attr*//
    printInc: function(increments,period){
        return moment(this.start).add(this.inc.product(increments)
              .add(this.startGap))
              .add(this.pRange.product(period))
              .format(DATEDISPLAYFORMAT);
    },
    printLabel: function(datetime){
        return (datetime).format(DATEDISPLAYFORMAT);
    }
}

Dove incremento, punto, data / ora passerebbero tutti da qualunque cosa stia usando i metodi di stampa del termine (pianificazione in questo caso).

    
posta slicedtoad 18.08.2014 - 21:10
fonte

0 risposte

Leggi altre domande sui tag