2012-04-28 12 views
5

Estoy comenzando con javascript y especialmente con el patrón OOP.Getters and setters en javascript

Mi pregunta es simple. En un setter, ¿hay alguna manera de mantener el mismo nombre para el parámetro y la variable de clase privada? He buscado en todas partes pero no he podido encontrar a nadie que lo mencione, solo ejemplos con diferentes nombres de var. Soy muy exigente con mi código y tengo que darle dos nombres diferentes.

Tomando el ejemplo de 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; 
    } 
}; 

se puede ver en la incubadora es el parámetro val pero la propiedad es realmente valor. Como es javascript, no puedo simplemente hacer this.value = value porque "this" lo haría público. value = value se referiría al parámetro (y sería muy extraño). ¿Realmente no hay manera de hacer esto? Si no, ¿hay alguna "mejor práctica" para esta situación? Supongo que el guión bajo podría ser válido, pero soy exigente, así que solo quiero asegurarme de que no haya otra forma.

¡Gracias!

Respuesta

5

Puede usar cierre para ocultar la variable.

function MyClass { 
    var value; 

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

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

} 

después del constructor MyClass acabados, el campo value es unacessible, ya que fue de ámbito sólo a este constructor (función). Por lo tanto, podemos decir que value es un campo privado. Sin embargo, los métodos getValue() y setValue() son públicamente accesibles desde el objeto construido y guardan referencia al alcance variable de MyClass, por lo que aún pueden manipular value.

+0

Los prototipos son agradables y rápidos. –

+0

Los cierres son muy interesantes, ¡gracias! Aún así, la pregunta era acerca de usar el mismo nombre de variable en el setter para el parámetro y la clase var, pero en tu ejemplo todavía tienes que usar diferentes. Estoy bloqueando una forma de usar el mismo nombre para ambos si es posible. Algo así como en java sería this.variable-variable (ambos se denominan variable pero el primero se refiere a la variable de clase y el segundo al parámetro – yowie

+0

@AlexWayne Claro, pero no se puede declarar la variable "oculta" en el prototipo ... aquí, el truco es que un constructor es una función que tiene un alcance variable que permanece en la memoria una vez que la función está terminada. Un prototipo es solo un objeto. Además, ¿cómo son los prototipos rápidos? no time. – Imp

1

Uso de cierres:

(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()); 

Aquí es un buen tutorial sobre closures in JS.

Cuestiones relacionadas