2012-03-19 21 views
6

Qual è la differenza tra la dichiarazione di variabili interne all'interno di una classe JavaScript con questo rispetto a var?Dichiarare le variabili nella classe JavaScript: questo contro var. Differenza?

Esempio:

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

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

Una differenza che siamo a conoscenza è Foo2.tool sarà resa "martello", mentre Foo.tool produrrà indefinito.

Ci sono altre differenze? Raccomandazioni per l'una contro l'altra?

Grazie!

+0

Beh, ovviamente il servono scopi diversi. Se non hai motivo di usare 'this.tool', usa' var tool'. – Blender

+0

Grazie, Blender! Ti dispiacerebbe elaborare i diversi scopi che servono? – Crashalot

+0

Dato che non puoi usare 'var tool' al di fuori della classe, non è fatto per essere usato al di fuori della classe. 'this.tool' è fatto per essere chiamato dall'esterno della classe. – Blender

risposta

14

qui non c'è "uno o l'altro" qui poiché lo scopo dei due è diverso.

considerare questo:

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 in OOP è una "proprietà pubblica", accessibile dall'esterno. se ho creato questa istanza di Melee, posso accedere e modificare weapon dal momento che è aperto al pubblico.

  • handitem.tool è una "proprietà privata". è accessibile solo dall'interno dell'oggetto. non è visibile, non accessibile e non è modificabile (almeno direttamente) dall'esterno. provando ad accedere restituirà undefined

  • handitem.getTool è un "metodo pubblico". dal momento che si trova all'interno dell'oggetto, ha accesso alla proprietà privata tool e ottenerlo dall'esterno. sorta di ponte verso il mondo privato.

  • handitem.attack è un metodo privato. come tutte le cose private, è accessibile solo dall'interno. In questo esempio, non v'è alcun modo per chiamare attack() (quindi siamo al sicuro dagli attacchi: D)

+0

Grazie, Joseph. Per chiarire, se creiamo diverse istanze di Mischia, ognuno avrà la sua copia di "strumento"? O aggiornerà uno "strumento" di sovrascrittura per gli altri? – Crashalot

+0

no, ogni volta che si chiama 'new Melee()' crea un altro oggetto. l'aggiornamento di una proprietà di uno non modificherà il valore dell'altro. – Joseph

+1

Quando si utilizza la parola chiave 'new', un nuovo oggetto univoco verrà creato e passato alla funzione' Melee'. Quindi ognuno avrà la sua proprietà separata 'arma'. Tuttavia, nel codice di @ Joseph, la variabile 'tool' è una variabile portata-funzione, quindi non è possibile modificarla direttamente dall'esterno della funzione. Avresti bisogno di un metodo 'setTool' per questo. –

Problemi correlati