2012-10-02 16 views
6

çıkarmadan bir işlevi geçersiz kılma:Böyle bir işlevi varsa statik özellikler

function a() { 
    console.log('a'); 
} 

ve sonra böyle bir statik özellik atayın:

a.static = 'foo'; 

Ama birlikte işlevini geçersiz kılmak istediğini söylüyorsun Bunun gibi bir işlevi:

var old = a; 

a = function() { 
    console.log('new'); 
    old.call(this); 
}; 

a.static // undefined 

Ben a yeni fonksiyona yana bu statik özellikler kaybolur. Statik özelliklerin döngü oluşturmadan ve el ile kopyalanmadan tutulması için düzgün bir yol var mı?

Güncelleme:

Size gerçek dünyadan senaryo: Ben de "genişletmek" istiyorum

$.fn.modal = function() { 
    // some code 
}; 

$.fn.modal.defaults = { // some object }; 

: Önyükleme jQuery eklentileri, yazar böyle mülkiyet işlevine varsayılan atar

var old = $.fn.modal; 

$.fn.modal = function() { 
    // do my thing 
    old.apply(this, arguments); 
} 

Ama bu

yapacak: prototip normalde yapacağını
$.fn.modal.defaults === undefined 

Bu, işlevselliği bozar, çünkü varsayılanlar kaybolur. Javascript sinsi bir yolu sadece işlevini statik özelliklerini kaybetmeden değiştirmek için var mı diye merak ediyordum.

+1

Böyle bir yaklaşımın ne işe yaradığını sorabilir miyim? Gerçekten dağınık görünüyor. – Christoph

+0

Bootstrap jQuery eklentilerinde, yazarın prototipine eklenmiş bir nesne olarak statik varsayılanlar atamasını istedim. Yani eğer onu uzatmak istersem, bağlı olan varsayılanları (ve muhtemelen diğer özellikleri) kaybederim. Ayrıca, yalnızca işlevi değiştirmenin bir yolu olup olmadığını merak ettiğimden, çünkü bu statik özelliklerden değil. – David

cevap

3

Hayır, bunu yapamazsınız. Nesnenin (işlev) değiştirilmesi, her zaman onunla birlikte herhangi bir özellik alır.

Burada iki çözüm vardır ve bunların her ikisi de eski nesneden yeniye özelliklerin aktarılmasını içerir.

$.fn.plugin = $.extend(function() { ... }, $.fn.plugin); 

İkinci seçenek dinamik eski işlev olarak yeni fonksiyonun prototipi ayarlamak olacaktır:

ilk (önerilir) yaklaşımı $.extend ile rahatlıkla yapılabilir özelliklerini kopyalamak için . Örneğin, bazı tarayıcılarda bu aşağıdaki gibi çalışır: Bu standart dışıdır ve komplikasyonlara yol açabilir; yapma

+0

İşlev özelliklerini kopyalamanın bir yolu olarak $ .extend'i düşünmedim, ancak gayet iyi çalışıyor. Teşekkürler – David

İlgili konular