Modo idiomatico per scrivere una classe JavaScript che mantiene lo stato e ti dice quando lo stato è cambiato

6

Sono uno sviluppatore C ++ esperto ma nuovo in JavaScript. Voglio scrivere una classe JavaScript ES6 che mantenga lo stato.

Come faccio a sapere quando lo stato è cambiato?

Posso pensare a due modi per farlo. Un modo è quello di ispezionare un'istanza della classe per vedere se è "sporca" dall'ultima volta che è stata contrassegnata come "pulita". Cioè contrassegnare un oggetto istanza come pulito e modificare qualsiasi membro dati della classe lo contrassegna come sporco. O essere in grado di confrontare due istanze della stessa classe. Se uno stato in entrata non è uguale a uno stato noto, allora lo stato è cambiato. So che questo non è incorporato in JavaScript.

Qual è il modo migliore per farlo in JavaScript? Sto lavorando in Typescript se fa la differenza.

    
posta Armbie 20.01.2016 - 17:37
fonte

2 risposte

1

In base ai commenti, ecco un'implementazione dirty-bit che dovrebbe funzionare:

class Dirtyable {
    private _isDirty:Boolean = false;
    get isDirty():Boolean {
        return _isDirty;
    }

    private _example:String;
    get example():String {
        return _example;
    }
    set example(val):String {
        if (val !== _example) _isDirty = true;
        _example = val;
    }
}
    
risposta data 20.01.2016 - 20:35
fonte
0

Sarebbe una soluzione accettabile se il numero di membri o campi dati della classe è elevato?

export class State {

    private _dirty: boolean = false;

    private _data1: string = '';
    private _data2: number = 0;

    constructor( d1: string, d2: number ) {
        this._data1 = d1;
        this._data2 = d2;
    }

    get dirty() {
        return this._dirty;
    }

    set dirty( value: boolean ) {
        this._dirty = value;
    }

    set( field: string, value: any ) {
        var theField: any = this[field];
        if ( theField != undefined ) {
            this[field] = value;
            this._dirty = true;
        }
        else {
            console.log( 'Field "' + field + '" is not defined' );
            throw 'Field "' + field + '" is not defined';
        }
    }
}

Esempio di utilizzo:

var rs1: State = new State( "one", 1 );

var isDirty = rs1.dirty;
rs1.set( '_data1', "two" );
isDirty = rs1.dirty;
rs1.set( 'blah', "two" );
    
risposta data 20.01.2016 - 21:21
fonte

Leggi altre domande sui tag