Domanda

Ho lavorato con getter e setter per evitare la prospettiva di utilizzare variabili globali. Tuttavia, ho incontrato un problema. Il codice qui sotto, che funziona bene con variabili intere, genera un'eccezione quando si tenta di eseguire una chiamata AJAX invece. Qualcuno può spiegare a me perché questo sta accadendo?


function Object_XML() {
    me = this;
    me.xml = null;
}

Object_XML.prototype = {

    getXML: function() {
        return me.xml
    },

    setXML: function(data) {
        me.xml = data;  
    },

    loadXML: function() {
        $.ajax({
            type: "GET",
            url: "questions.xml",
            dataType: "xml",
            success: function(xml) {
                me.setXML(xml);         
            } //close success       
        });//close AJAX 
    }//close setXML

};

$(document).ready(function() {  
    var data = new Object_XML();
    alert("This is an " + data.getXML());
    data.setXML();
    alert("This is an " + data.getXML());
});

Grazie, Elliot Bonneville

È stato utile?

Soluzione

Hai appena negato l'utilizzo di variabili private con getter e setter utilizzando me = this; Hai appena fatto me una variabile globale non usando var. (Qualsiasi variabile non definita utilizzando var si attacca al namespace globale)

Nel vostro caso, poiché si sta lavorando all'interno della stessa portata oggetto che si può semplicemente utilizzare this ed evitare il me come personalmente, penso che sia confuso. Ma se si vuole attenersi a tale paradigma, l'uso var me = this;

Il vostro esempio è davvero poco chiara, in cui accade l'errore? Si sta chiamando data.setXml() senza parametri, in modo da me.xml punterà insieme a undefined. Questo è da aspettarsi se si passa nulla nel metodo.

Anche tenere a mente che a causa della natura asincrona della tua chiamata, se si dovesse fare qualcosa di simile:

data.loadXml();
console.log("data.getXML();", data.getXML());  // would be undefined

data.getXML () in quel momento sarebbe ancora indefinito in quanto è probabile che la chiamata asincrona non è ancora tornato, quindi non impostare l'attributo XML del vostro oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top