Die Speicherung von Referenz-Funktion im Objekt/variable

Habe ich gesucht, um für diese aber bisher nicht in der Lage zu finden, ein Duplikat, ich kann mit den falschen keywords...

Ich versuche, ändern Sie vorübergehend eine Funktion in einem Objekt gespeichert, aber ich habe Probleme bei der Einstellung zurück zu dem, was es vorher war.

Bedenken Sie:

//Set the options object
var options = {
    success: function(){
        console.log('Original Function Called');
    }
}

//Save the options
$('#foo').data('bar',options);

Und dann in einer anderen Funktion:

//Get the options
var options = $('#foo').data('bar');

//Store the old options
var old_options = options;

//Temporarily change the success function
options.success = function(){
    console.log('Temporary Function Called');
}

//Save the options
//This allows the other functions to access the temporary function
$('#foo').data('bar',options);

//Do stuff here that uses the new options

//Reset the options to include the original success function
$('#foo').data('bar',old_options);

Hätte ich erwartet, dass das nur die Anzeige Temporary Function Called einmal, es scheint jedoch, um vollständig ersetzen Sie die alte success Rückruf mit der temporären Rückruf.

Kann mir jemand sagen warum und wie kann ich dies umgehen?

UPDATE

Dachte ich, dass extend würde dieses Problem beheben, aber es scheint, dass das Problem vielleicht ein bisschen tiefer. Ich habe beschlossen, zu veröffentlichen ein snippet von meinem eigentlichen code dieser Zeit. Bitte beachten Sie die folgenden Punkte, bevor Sie Lesen:

  1. SM ist ziemlich viel nur ein alias von jQuery, bitte ignorieren Sie es.
  2. success und error werden Parameter geliefert, um die Funktion

Hier ist mein code:

//Get the properties
var properties = $(form).data('autosave');
switch(parameter){
    case 'save':
        var old_properties = $.extend({},properties);
        //Set the new callbacks if they have been supplied
        properties.options.success = typeof success!=='undefined' ? success : old_properties.options.success;
        properties.options.error = typeof error!=='undefined' ? error : old_properties.options.error;
        //Save the properties
        $(form).data('autosave',properties);
        //Call the save method before setting the interval
        SM(form)._as_save();
            properties = $.extend({},old_properties);
        //Save the old properties
        $(form).data('autosave',properties);
        //Clear the current interval
        clearInterval(properties.interval);
        //Call the save method periodically
        properties.interval = setInterval(function(){
        SM(form)._as_save();
        },properties.options.interval);
    break;
}
//Save the properties
$(form).data('autosave',properties);
  • Du sagst, dass nach $('#foo').data('bar',old_options); Sie sind immer noch zu sehen Temporary Function Called?
  • Genau! 🙂
  • Ich habe in der Tat
  • Einige gute Antworten da unten.
  • Ich bin ein wenig verwirrt - das neue update, war, dass nach unserer Diskussion über die flache Kopie gegen Tiefe Kopie? Ich sehe deine success Methode ist eigentlich eine options.success() Methode (und Analog für error). Das ist genau die situation, wo eine Tiefe Kopie erforderlich wäre. So sind die Dinge noch gebrochen, oder war der Tiefe Kopie den trick tun?
  • Nein, das kam vor 🙂 Die Tiefe es behoben
  • Uff! Sie hatte mich besorgt an. Es macht Sinn, jetzt, Blick auf den code im update: Der flache Kopie gearbeitet haben würde, mit Ihrem code in der ursprünglichen Frage, wo die success Rückruf wurde ein first-level-Eigenschaft des main-options-Objekt. Aber der eigentliche code in Ihrem update ist ein bisschen anders: es hat eine properties.options.success Funktion - nicht ein direktes untergeordnetes Objekt, sondern zwei Stufen nach unten. Das ist genau die situation, in der eine Tiefe Kopie benötigt wird (oder zumindest eine mehr spezialisierte kopieren würde, Griff dieser verschachtelten Objekts).

InformationsquelleAutor Ben Carey | 2013-06-19
Schreibe einen Kommentar