2011-11-28 39 views
37

Acaba, "bunu geri döndür" bir javascript işlevi içinde ne yapar, amacı nedir?"Bu durumu" javascript işlevi içinde ne yapar?

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Ne bir işlev içinde yapmak "bu dönüş" vermez: aşağıdaki kodu var varsayarak?

Yukarıdaki kodun ne olduğunu ve "this" anahtar sözcüğünün ne olduğunu biliyorum. Ben sadece "bunu geri döndür" ün bir fonksiyonun içinde ne yaptığını bilmiyorum.

+1

user722756 @: Eğer şöyle zincir talimatlarına istiyorsanız bu yararlı olabilir method' Function.prototype' 'eklenir' Çünkü 'this' 'yöntemin' çağrıldığı bir işleve başvurur. Bu fonksiyonun bir "yapıcı" olarak kullanılması gerektiği kastedilmektedir, çünkü "yöntem" fonksiyonun "prototip" nesnesini genişletmektedir. – RightSaidFred

+1

"Bu" anahtar sözcüğün kullanımını biliyorum, sadece bir işlev içinde "bunu döndür" ifadesinin ne olduğunu bilmiyorum. – user722756

+7

'dönüşü, bir [akıcı arayüz] oluşturmak için kullanılır (http://en.wikipedia.org/wiki/Fluent_interface). @marcioAlmada ve @AdamRackis tarafından yayınlanan cevaplara bakın. –

cevap

48

Yöntemin şu anda çağrıldığı nesne örneğini ifade eder. Zincirleme için kullanılır. bar çok nesne üzerinde çağrılır

myObject.foo().bar(); 

, (myObject bir referans) this döner foo beri: Örneğin, böyle bir şey yapabilirdi. Bu

myObject.foo(); 
myObject.bar(); 

yapıyor aynı şeydir Ama az yazar.

function AnimalSounds() {} 

AnimalSounds.prototype.cow = function() { 
    alert("moo"); 
    return this; 
} 

AnimalSounds.prototype.pig = function() { 
    alert("oink"); 
    return this; 
} 

AnimalSounds.prototype.dog = function() { 
    alert("woof"); 
    return this; 
} 

var sounds = new AnimalSounds(); 

sounds.cow(); 
sounds.pig(); 
sounds.dog(); 

sounds.cow().pig().dog(); 

http://jsfiddle.net/jUfdr/

+0

Neden "prototip" kelimesinin genişletilmesinden bu yana gerçek kodu kullanmıyorsunuz? AnimalSounds.method ('inek', func ...) .method ('köpek', func ...) .method ('köpek', func ...); ' – RightSaidFred

10

tl; dr bir yöntemin this dönen birbirine yöntemlerin "zincir" izin vermek için yaygın bir yoludur.


this mevcut bağlamda ifade eder ve siz bir fonksiyonu çağıran ediyoruz ettiği şekilde bağlı anlam değiştirir. işlev çağırma ile

, this işlevi bir usul ile ilgili çağrılmakta bile, genel nesneyi ifade eder ve fonksiyon olarak yürütmesini yöntem ile aynı sınıfa aittir. Douglas Crockford bunu "dilin tasarımında hata" olarak tanımlamıştır [Crockford 28]

Yöntem çağırma ile this, yönteminin çağrıldığı nesneye başvurur.

Çağırma işlemini uygularken, this numaralı telefon çağrıları geçerli olduğunda geçerlidir. Yapıcı çağırma ile

, this yapıcı çıkışları (eğer misguidedly bir yapıcı kendi nesneyi döndürmek yok), döndürülen perde arkasında sizin için oluşturulan olan nesneye, ifade eder. Yukarıdaki örnekte

, böylelikle zincirleme izin dinamik işlevleri ekleyebilirsiniz ve this döndürür method denilen yeni bir yöntem yaratıyorsun. böylece

Car.method("vroom", function(){ alert("vroom"); }) 
    .method("errrk", function() { alert("errrk"); }); 

ve:

Böylece gibi bir şey yapabilirdi.

11

sahip olabilir: Burada

daha tam örnektir Yöntemin ait olduğu nesneyi döndüreceği anlamına gelir.

MyObject.method1().method2().method3(); 

Gerçek dünya örneği: jQuery

$(this).addClass('myClass').hide(); 
+6

+1 Bu pratik ne jQuery ünlüdür için. – BoltClock