2012-10-02 13 views
6

Jeśli mam funkcję tak:Zastępowanie funkcji bez usuwania właściwości statycznych

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

a następnie przypisać właściwości statycznej takiego:

a.static = 'foo'; 

Ale mówią, że chcą zastąpić funkcję z inną funkcją takiego:

var old = a; 

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

a.static // undefined 

Odkąd przypisać nową funkcję do a, to właściwości statyczne są tracone. Czy istnieje dobry sposób na zachowanie właściwości statycznych bez zapętlenia i ręcznego ich kopiowania?

Aktualizacja:

Oto prawdziwy scenariusz świat: W wtyczek Bootstrap jQuery, autor przypisuje domyślne dla funkcji własności jak ta:

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

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

Więc jeśli chcę "przedłużyć" THE prototyp ja normalnie zrobić:

var old = $.fn.modal; 

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

Ale która stałaby

$.fn.modal.defaults === undefined 

Spowoduje to przerwanie działania, ponieważ ustawienia domyślne zostaną utracone. Zastanawiam się, czy istnieje podejrzany sposób w javascript, aby zmienić tylko funkcję bez utraty właściwości statycznych.

+1

Czy mogę zapytać, jakie jest zastosowanie takiego podejścia? Wygląda naprawdę nieładnie. – Christoph

+0

Pytam, ponieważ w wtyczkach jQuery bootstrap autor przypisuje statyczne wartości domyślne jako obiekt dołączony do prototypu. Więc jeśli chcę go przedłużyć, tracę domyślne (i ewentualnie inne właściwości), które są dołączone. Ponadto, ponieważ jestem ciekawy, czy istnieje sposób, aby zmienić tylko funkcję, nie jest to właściwości statyczne. – David

Odpowiedz

3

Nie, nie możesz tego zrobić. Zastąpienie obiektu (funkcji) zawsze ma z nim wszelkie właściwości.

Są tu dwa rozwiązania, które obejmują przenoszenie właściwości ze starego obiektu na nowy.

Pierwsze podejście (zalecane) jest skopiowanie właściwości, które można zrobić wygodnie z $.extend:

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

Drugim rozwiązaniem byłoby dynamicznie ustawić prototyp nowej funkcji będzie stary funkcja . Na przykład w niektórych przeglądarkach będzie to działać:

var f = function() { ... }; 
f.__proto__ = $.fn.plugin; 
$.fn.plugin = f; 

Jest to jednak niestandardowe i może powodować komplikacje; nie rób tego.

+0

Nie uważałem '$ .extend' za sposób kopiowania właściwości funkcji, ale działa dobrze. Dzięki – David

Powiązane problemy