2009-12-27 8 views
8

Sadece10 yerine this.somevar anahtar kelimesini ne zaman kullanmanız gerektiğini merak ediyorum.as3: bu anahtar kelimenin kullanımı

Genellikle aşağıdaki durumlarda bu kullanmayan

: i sınıf için bir var olarak gizli yaptık

  1. ben bu sınıf için yerel bir var olarak kullanmak amacıyla kendisine atıfta

doğru? ya da bu sadece bir stil değil mi?

cevap

9

Genellikle sadece aynı adla bir parametresi olan bir işlev içinde ise this.varname kullanmak zorunda ve üye değişkeni başvurmak istiyorum. Üyenin varisinin özel olup olmadığı, 'bu' kullanma zorunluluğu yoktur.

+0

teşekkürler. Bu, öğrenmek istediğimi temizler. Bu ayrıntılara girdiğiniz için – jml

3

Bunu bir nesnenin içinde kullanırsanız, bu nesnenin kendisine aittir. İşte bunu kullanan nerede bir örnek:

package 
{ 
    public class foo 
    { 
     private var variable:uint; 

     public function foo(variable:uint) 
     { 
      this.variable = variable; 
     } 
    } 
} 
+0

Bunun zaten olduğunu düşünüyorum. aşağıdaki yoruma bakın; yararlı buldum. Teşekkürler! – jml

4

önce de söz edildiği gibi, bir sınıf üyesi yönteminden bir sınıf üyesi değişkeni başvurmak isteyen çok basit bir durumda, örneğin içinde bu kullanmaya gerek yoktur:

public function myClassMethod() : void 
{ 
    // "this" is redundant here, as it is implied if omitted 
    this.myPrivateOrPublicVariable = 123; 
} 

Not: 'un bu'un (bir programda karşılaşıldığı anda değerlendirilen, tahmin edilebileceği gibi değil) değerlendirildiği durumlar, yazılmakta olduğu sınıfa karşılık gelmez. Daha spesifik olarak, bu, Function.apply() gibi bir yöntem kullanılarak çağrılacak bir işlev içinde kullandığınızda olur. Bu yöntem, arayanın tarafından belirtilecek nesneyi bu tarafından belirtilmesini sağlar ve geri aramalarda yaygın olarak kullanılır, örn. doldurma motorlarında. İşte

// Call myFunction(listOfArguments[0], listOfArguments[1] ...), 
// with this referring to objectReferredToByThis. 
myFunction.apply(objectReferredToByThis, listOfArguments); 

bu ziyade sınıfının bir örneğine (yani MovieClip _mc) doldurulan nesneye atıfta sağlayan varsayılan davranıştır popüler arayı doldurma motoru Tweener'dan ile bir örnek olan bu yazılmıştır (yani MyClass). Biz açıkça bizim MovieClip (_mc) ait görünür durumunu değiştirmek için çalışma zamanını talimat istedikleri için yukarıdaki kodu
package 
{ 
    /* ... imports ... */ 

    public class MyClass extends Sprite 
    { 
    private var _mc : MovieClip; 

    public function tweenSomething() : void 
    { 
     var tween : Object = { 
     x: 0, 
     time: 1, 
     onComplete: function() : void { 
      // Here, "this" will not refer to the instance 
      // of MyClass, but rather to the _mc MovieClip, 
      // which is the object being tweened below. 
      this.visible = false; 
     } 
     }; 

     Tweener.addTween(_mc, tween); 
    } 
    } 
} 

, bu kullanımı gereklidir. bu kullanılmamış olsaydık, referans referansı, MyClass.visible işlevinin kapanması nedeniyle başvurulan olurdu.

+0

teşekkürler. Açıklamaları takdir ediyorum. – jml

+0

hmm, bunu neden ara doldurucu örneğinde anlamıyorum. movieclip'i ifade eder. – Rihards

+0

@Richards, arayanın (Tweener içinde), "bu" değişkeni tarafından referans olarak gösterilmesi için ara doldurma hedefini belirtmesi nedeniyle yapar. Function.apply() ile ilgili belgelere bakın. Şerefe – richardolsson

0

Her şeyden önce, this anahtar sözcüğünü kullanmaya başlamak için, kodda yerel veya global (yöntem veya sınıf sahibi) değişkeninin olup olmadığını hızlı bir şekilde tanımanıza yardımcı olur. Tek yapmanız gereken, this görebileceğiniz bir kod parçasına ihtiyaç duyuyor ve bunun, bunun, hedef tanımı için ek kaydırma yerine, global olarak görünür bir sınıf değişkeni olduğunu hemen fark etmenizi sağlıyoruz.Eğer üye değişkenleri ve işlevleri temelde iki şekilde başvurabilir, ActionScript 3'te:

2

şey diğer cevaplar eklemek için

// 1. the normal way 
obj.var = 5; 
obj.func(); 

// 2. the auxiliary way 
obj["var"] = 5; 
obj["func"](); 

Bu anlamsız görünebilir, ama ne zaman belli durumlarda bitiştirmek, örneğin, orada çeşitli kombinasyonlar içine dizeleri bu gibi yararlı olabilir bir nesne rastgele dinamik belirtilen değişkenleri veya işlevleri kullanmak için:

private function someFunc():void 
{ 
    obj[randomFuncStr()](); 
} 

private function randomFuncStr():String 
{ 
    // randomly decide on a function to call and return its name as a String 
} 

Amaiçinde değişkenleri veya işlevlerine erişmek için Dizeler kullanmak istiyorsanız neyi? Bu işe yaramazsa:

"var" = 5; // error 
"func"(); // error 

Yani onun yerine yapmam gereken şudur:

this["var"] = 5; // the this keyword is good for something after all! 
this["func"](); // " " " " " " " " " 

Diğer insanlar zaten bu sonraki sebep sözü, ancak ilk kez hiç ciddiye this.var veya this.func() aldı gelmiş AS3'te (ve hala açık bir şekilde hor görerek kullanımına bakıyorum), width isimli bir parametresi ve height isimli bir parametresi olan UIComponent.setLayoutBoundsSize()'u geçersiz kıldığım zamandı. UIComponent ayrıca bu adları özellik olarak kullanır ve bir yöntemi geçersiz kılarken parametre adlarını değiştirmeyi sevmem. Yani this.width = x; veya this.height = y; gibi şeyler aniden ilgili oldu. Bu iki senaryodan ayrı olarak, aynı nesne içindeki bir değişkene veya işleve başvururken, this'u kullanmak için bir neden göremiyorum.

Bir yan not olarak, bir API oluşturulduğu ya da gerçekten iyi bir sebepten ötürü bu küçük şeyi yapmak zorunda kalıyorsanız (bazen bu gibi şeyler ayarlamayı denemeyin) this'u, bir işlevin argüman olarak veya çağıran nesneye geri gönderilmesi gereken bir şey olarak geçebilir.