2012-10-02 11 views
6

Wenn ich eine Funktion wie dieses:Aufschalten einer Funktion, ohne entfernen statische Eigenschaften

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

und dann eine statische Eigenschaft wie folgt vergeben:

a.static = 'foo'; 

aber sagen, dass ich die Funktion außer Kraft setzen wollen mit eine andere Funktion wie folgt aus:

var old = a; 

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

a.static // undefined 

Da ich eine neue Funktion a zugewiesen, es ist statische Eigenschaften sind verloren. Gibt es eine gute Möglichkeit, die statischen Eigenschaften beizubehalten, ohne sie zu kopieren und manuell zu kopieren?

Update:

Hier ist eine reale Welt Szenario: In Bootstrap jQuery-Plugins, der Autor weist standardmäßig auf die Eigenschaftsfunktion wie folgt aus:

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

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

Also, wenn ich will die "verlängern" Prototyp würde ich normalerweise tun:

var old = $.fn.modal; 

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

Aber das würde

$.fn.modal.defaults === undefined 

Dies unterbricht die Funktionalität, da die Standardwerte verloren gehen. Ich frage mich, ob es eine hinterhältige Art und Weise in Javascript ändern nur die Funktion ohne die statischen Eigenschaften zu verlieren.

+1

Darf ich fragen, was die Verwendung eines solchen Ansatzes ist? Es sieht wirklich chaotisch aus. – Christoph

+0

Ich frage, weil in Bootstrap jQuery-Plugins der Autor statische Vorgaben als ein Objekt an den Prototyp angehängt. Also, wenn ich es erweitern möchte, verliere ich die Standardwerte (und möglicherweise andere Eigenschaften), die angehängt sind. Auch, weil ich neugierig bin, ob es eine Möglichkeit gibt, nur die Funktion zu ändern, nicht ihre statischen Eigenschaften. – David

Antwort

3

Nein, das geht nicht. Ersetzen des Objekts (Funktion) nimmt immer alle Eigenschaften mit sich.

Hier gibt es zwei Lösungen, bei denen beide die Eigenschaften vom alten Objekt auf das neue übertragen.

Der erste (empfohlen) Ansatz ist es, die Eigenschaften zu kopieren, die bequem mit $.extend getan werden kann:

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

Die zweite Option dynamisch wäre, den Prototyp der neuen Funktion zu setzen die alte Funktion zu sein . Zum Beispiel würde dies in einigen Browsern funktionieren:

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

Dies ist jedoch nicht Standard und könnte zu Komplikationen führen; mach es nicht.

+0

Ich dachte '$ .Extend' nicht als eine Möglichkeit, Funktionseigenschaften zu kopieren, aber es funktioniert gut. Vielen Dank – David

Verwandte Themen