2012-04-28 19 views
5

Sto iniziando con javascript e specialmente con il modello OOP.getter e setter in javascript

La mia domanda è semplice. In un setter, c'è un modo per mantenere lo stesso nome per il parametro e la variabile della classe privata? Ho cercato ovunque ma non ho trovato nessuno che lo menzionasse, solo esempi con nomi var diversi. Sono molto esigente con il mio codice e ho dovuto dargli due nomi diversi.

Prendendo l'esempio da http://ejohn.org/blog/javascript-getters-and-setters/

function Field(val){ 
    this.value = val; 
} 
Field.prototype = { 
    get value(){ 
     return this._value; 
    }, 
    set value(val){ 
     this._value = val; 
    } 
}; 

si può vedere nella setter il parametro è val ma la proprietà è in realtà di valore. Dal momento che è javascript non posso semplicemente fare this.value = value perché "this" lo renderebbe pubblico. valore = valore si riferirebbe sia al parametro (e sarebbe molto strano). Non c'è davvero alcun modo per fare questo? In caso contrario, esiste una "migliore pratica" per questa situazione? Credo che il carattere di sottolineatura potrebbe essere valido, ma sono solo pignolo, quindi voglio solo assicurarmi che non ci sia un altro modo.

Grazie!

risposta

5

È possibile utilizzare la chiusura per nascondere la variabile.

function MyClass { 
    var value; 

    this.getValue = function() { 
    return value; 
    } 

    this.setValue = function(val) { 
    value = val; 
    } 

} 

dopo il costruttore MyClass finiture, il campo value è unacessible, come è stato ambito solo a questa costruzione (funzione). Quindi possiamo dire che value è un campo privato. Tuttavia, i metodi getValue() e setValue() sono accessibili pubblicamente dall'oggetto costruito e mantengono il riferimento all'ambito variabile di MyClass, pertanto possono ancora manipolare value.

+0

I prototipi sono belli e veloci. –

+0

Le chiusure sono molto interessanti, grazie! Tuttavia, la domanda riguardava l'uso dello stesso nome di variabile nel setter per il parametro e la classe var, ma nel tuo esempio devi ancora usarne di diversi. Sto bloccando per un modo di usare lo stesso nome per entrambi se è possibile. Qualcosa di simile in java sarebbe questa variabile.variabile (entrambi sono chiamati variabili ma il primo si riferisce alla variabile di classe e il secondo al parametro – yowie

+0

@AlexWayne Sure, ma non è possibile dichiarare la variabile "nascosta" nel prototipo ... qui, il trucco è che un costruttore è una funzione, che ha un ambito variabile che rimane nella memoria dopo che la funzione è finita.Il prototipo è solo un oggetto.Inoltre, come sono i prototipi veloci? Salvano la memoria, non tempo – Imp

1

Uso chiusure:

(function(exports){ 

    exports.field = {}; 
    var _value = '123'; 

    exports.field.get = function(){ 
     return _value; 
    } 

    exports.field.set = function(val){ 
     _value = val; 
    } 

})(window); 

console.log(field.get()); 

Ecco un buon tutorial su closures in JS.