2012-03-19 16 views
6

var vs bu sahip olan bir JavaScript sınıf içinde iç değişkenleri bildirmek arasındaki fark nedir?JavaScript sınıfında değişkenler bildirme: bu, değişkene karşı. Fark?

Örnek: Biz Foo.tool tanımsız verecektir oysa Foo2.tool "çekiç" verecektir olduğunu farkındayız

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

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

farklardan biri.

orada başka farklılıklar mı? Biri diğerine yönelik öneriler?

Teşekkürler!

+0

Eh, tabii ki farklı amaçlara hizmet eder: bu örnekte, attack() aramaya yolu yoktur (D yüzden saldırıdan güvenlidir). This.tool'unu kullanmak için herhangi bir nedeniniz yoksa, 'var tool' kullanın. – Blender

+0

Teşekkürler, Blender! Hizmet ettikleri farklı amaçlar hakkında düşünür müsün? – Crashalot

+0

Sınıfın dışında "var aracı" kullanamadığınız için, sınıfın dışında kullanılmaz. 'this.tool', sınıfın dışından çağrılmak üzere yapılır. – Blender

cevap

14

hayır "birini veya diğerini" ikisinin amacı farklı olduğundan burada yoktur.

bu göz önünde bulundurun: OOP

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 dışarıdan erişilebilen bir "kamu malı" dir. Melee'un bu örneğini oluşturduysam, herkese açık olduğundan weapon'a erişebilir ve bunları değiştirebilirim.

  • handitem.tool bir "özel mülkiyet" tir. Sadece nesnenin içinden erişilebilir. Görünür değil, erişilebilir değil ve dışardan (en azından doğrudan) değiştirilemez. erişmeye çalışırken, undefined

  • handitem.getTool bir "genel yöntemdir". Nesnenin içinde olduğu için, tool özel mülküne erişebilir ve dışarıdan sizin için alabilirsiniz. özel dünyaya bir tür köprü.

  • handitem.attack özel bir yöntemdir. Tüm özel şeyler gibi, sadece içeriden erişilebilir.

+0

Teşekkürler, Joseph. Açıkça söylemek gerekirse, farklı Melee örneklerini yaratırsak, her biri kendi "aracı" kopyasını alacak mı? Veya diğerleri için bir "araç" üzerine güncellenecek mi? – Crashalot

+0

nope, her defasında yeni Melee() 'yi çağırırsanız başka bir nesne oluşturur. birinin özelliğini güncellemek, diğerinin değerini değiştirmeyecektir. – Joseph

+1

'new' anahtar sözcüğünü kullandığınızda, yeni ve benzersiz bir nesne oluşturulacak ve' Melee' işlevine iletilecektir. Böylece her birinin kendi ayrı "silahı" özelliği olacaktır. Ancak, Joseph'in kodunda, 'tool' değişkeni bir işlev-kapsam değişkeni olduğundan, onu doğrudan işlevin dışından değiştiremezsiniz. Bunun için bir 'setTool 'yöntemine ihtiyacınız olacaktır. –

İlgili konular