2012-03-19 11 views
6

¿Cuál es la diferencia entre declarar variables internas dentro de una clase de JavaScript con este vs var?Declarando variables en la clase de JavaScript: esto vs. var. ¿Diferencia?

Ejemplo:

function Foo() { 
    var tool = 'hammer'; 
} 

function Foo2() { 
    this.tool = 'hammer'; 
} 

Una diferencia somos conscientes de que es Foo2.tool le dió "martillo", mientras que Foo.tool rendirá indefinido.

¿Hay otras diferencias? Recomendaciones para uno contra el otro?

Gracias!

+0

Bueno, obviamente, la responden a distintas finalidades. Si no tiene ningún motivo para usar 'this.tool', use' var tool'. – Blender

+0

¡Gracias, Blender! ¿Te importaría explicar los diferentes propósitos a los que sirven? – Crashalot

+0

Dado que no puede usar 'var tool' fuera de la clase, no está hecho para ser utilizado fuera de la clase. 'this.tool' está hecho para ser llamado desde fuera de la clase. – Blender

Respuesta

14

aquí no hay "uno u otro" ya que el propósito de los dos es diferente.

Considera:

var Melee = function(){ 

    //private property 
    var tool = 'hammer'; 

    //private method 
    var attack = function(){ 
     alert('attack!'); 
    }; 

    //public property 
    this.weapon = 'sword'; 

    //public methods 
    this.getTool = function(){ 
     return tool; //can get private property tool 
    }; 
    this.setTool = function(name){ 
     tool = name; //can set private property tool 
    }; 
}; 

var handitem = new Melee(); 
var decoration = new Melee(); 

//public 
handitem.weapon;     //sword 
handitem.getTool();    //hammer 
handitem.setTool('screwdriver'); //set tool to screwdriver 
handitem.getTool();    //is now screwdriver 

//private. will yield undefined 
handitem.tool; 
handitem.attack(); 

//decoration is totally different from handitem 
decoration.getTool();   //hammer 
  • handitem.weapon en programación orientada a objetos es una "propiedad pública", accesible desde el exterior. si creé esta instancia de Melee, puedo acceder y modificar weapon ya que está abierta al público.

  • handitem.tool es un "propiedad privada". solo es accesible desde el interior del objeto. no es visible, no accesible y no modificable (al menos directamente) desde el exterior. intentar acceder a él devolverá undefined

  • handitem.getTool es un "método público". ya que está en el interior del objeto, tiene acceso a la propiedad privada tool y la obtiene desde el exterior. una especie de puente hacia el mundo privado.

  • handitem.attack es un método privado. como todo lo privado, solo se puede acceder desde adentro. en este ejemplo, no hay manera de llamar attack() (por lo que estamos a salvo de los ataques: D)

+0

Gracias, Joseph. Para aclarar, si creamos diferentes instancias de Melee, ¿cada uno obtendrá su propia copia de "herramienta"? ¿O actualizará una "herramienta" de sobreescritura para las demás? – Crashalot

+0

no, cada vez que llamas 'new Melee()' crea otro objeto. actualizar una propiedad de uno no cambiará el valor de la otra. – Joseph

+1

Cuando usa la palabra clave 'new', se creará un objeto nuevo y único que se pasará a la función' Melee'. Por lo tanto, cada uno tendrá su propia propiedad de "arma" separada. Sin embargo, en el código de @Joseph, la variable 'herramienta' es una variable de ámbito de función, por lo que no puede modificarla directamente desde fuera de la función. Necesitarías un método 'setTool' para eso. –

Cuestiones relacionadas