2012-10-02 13 views
6

Se ho una funzione come questa:Override di una funzione senza rimuovere le proprietà statiche

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

e quindi assegnare una proprietà statica come questo:

a.static = 'foo'; 

Ma dico io voglio ignorare la funzione con un'altra funzione come questa:

var old = a; 

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

a.static // undefined 

da quando ho assegnato una nuova funzione per a, le sue proprietà statiche sono perse. C'è un modo pulito per mantenere le proprietà statiche senza loop e copiarle manualmente?

Aggiornamento:

Ecco uno scenario del mondo reale: In plugin Bootstrap jQuery, l'autore assegna il valore predefinito è la funzione di proprietà come questa:

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

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

Quindi, se voglio di "estendere" la prototipo io normalmente fare:

var old = $.fn.modal; 

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

Ma che renderebbero

$.fn.modal.defaults === undefined 

Ciò interromperà la funzionalità, poiché i valori predefiniti vengono persi. Mi stavo chiedendo se c'è un modo subdolo in javascript per cambiare solo la funzione senza perdere le proprietà statiche.

+1

Posso chiedere quale è l'utilizzo di tale approccio? Sembra davvero disordinato. – Christoph

+0

Sto chiedendo perché nei plugin jstery di bootstrap, l'autore assegna i valori di default statici come un oggetto collegato al prototipo. Quindi, se voglio estenderlo, perdo le impostazioni predefinite (e possibilmente altre proprietà) che sono allegate. Inoltre, perché sono curioso di sapere se esiste un modo per cambiare solo la funzione, non le sue proprietà statiche. – David

risposta

3

No, non puoi farlo. Sostituire l'oggetto (funzione) prende sempre qualsiasi proprietà con esso.

Qui ci sono due soluzioni, entrambe implicano il trasferimento delle proprietà dal vecchio oggetto a quello nuovo.

Il primo (consigliato) approccio è quello di copiare le proprietà, che può essere fatto facilmente con $.extend:

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

La seconda opzione sarebbe quella di impostare dinamicamente il prototipo della nuova funzione di essere la vecchia funzione . Ad esempio, in alcuni browser funziona:

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

Tuttavia, questo non è standard e potrebbe dar luogo a complicazioni; non farlo

+0

Non ho pensato a '$ .extend' come un modo per copiare le proprietà delle funzioni, ma funziona perfettamente. Grazie – David

Problemi correlati