2013-08-26 17 views
5

Bazen, genel ad alanı karmaşasını azaltmak ve kitaplık ihracatını kolaylaştırmak için kodunuzu büyük bir nesneye ad alanı olarak sunmanın iyi bir uygulama olduğunu duydum, bu yüzden bunu denedim .Nesne bildirimi tamamlanmadan önce üye yöntemlerini çağırma işlemi tamamlandı

"Foo'nun tanımlanmadığını" iddia ederek başarısız olur. Nesne bildirimini bitirmeden önce arama yöntemleri büyük olasılıkla kötüdür, bu yüzden çubuğu taşıdım ve işe yaradı.

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
}; 
wrapper.bar = wrapper.foo(); 

Bu özellikle iç içe ad ile, tür çirkin olabilir hissediyorum böyle, bu yüzden zor bir kerede sarmalayıcı üyelerinin tamamını görmek için yapmazlar herhangi çözüm yolu vardır?

+0

Niye hiç çağırmak gerekir beyanda yöntem mi? Belki hemen çağrılan bir işlev kullanmak istersiniz (* IEFE *). Ayrıca * modül kalıbını kontrol edin *. – Bergi

cevap

1

Sorun şu ki, this genel bağlama eşit olacak. Öyle gibi işlev erişmesi gereken:

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
    bar: null, 
    init : function() { 
     // all initialization code goes here 
     wrapper.bar = wrapper.foo(); 
    } 
}; 

wrapper.init(); 

Bu yöntem ve gelecekteki geliştiriciler kolayca size javascript aradığınızı bulabilmek için mantıksal parçalara ayrılmasına kodunuzu düzenlemek için mükemmeldir. sarıcı 1 olmadığı sürece) bir fonksiyon çalışmaz böyle this kullanma

+0

Hm, Chrome, "undefined öğesinin" foo "yöntemini çağıramıyor" diye iddia ediyor. Bu, sarıcının tanımsız olduğunu ima ediyor? –

+0

Güncellenecek kod güncellendi. Bu mimarinin en yaygın kullanımı, tüm değişken başlatımlarını yapan bir tür init işlevi içermektir. Bu, değişkenlerinizin DOM ile ilgili referanslar içermesi durumunda bir belge yük devretme olayında yapılabilir: 'wrapper.bar = document.getElementById ('bar');' DOM –

0

, ve 2) Eğer örneğini onu kullanmanın:

var wrapper = function() { 
    this.foo = function() { return 42; } 
    this.bar = this.foo(); 
}; 

var wrapperInstance = new wrapper(); 
alert(wrapperInstance.bar()); // 42 
wrapperInstance.foo(); // also works 
+0

'da arama yapıyorsunuz, demek istediniz' alert (wrapperInstance.bar); wrapperInstance.foo(); ', çubuğun bir işlev olmadığını ve sarıcının hiçbir üyesi olmadığını düşünerek. Bu aynı zamanda bir sarıcı için çok fazla bir şey gibi görünüyor, çünkü sadece bir kez kullanacağınız bir kurucu yapmak aptalca gözüküyor ... –

+0

Evet, ileriye gittim ve buna göre düzenledim. Bu o aptalca değil - tek kişilik kalıbı. :) –

İlgili konular