Pergunta

Tenho trabalhado com getters e setters para evitar a perspectiva de usar variáveis ​​globais.No entanto, me deparei com um problema.O código abaixo, que funciona bem com variáveis ​​inteiras, gera uma exceção quando tento executar uma chamada AJAX.Alguém pode me explicar por que isso está acontecendo?


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());
});

Obrigado, Elliot Bonneville

Foi útil?

Solução

Você acabou de negar o uso de variáveis ​​privadas com getters e setters usando me = this; Você acabou de fazer me uma variável global ao não usar var.(qualquer variável não definida usando var é anexada ao namespace global)

No seu caso, como você está trabalhando no mesmo escopo de objeto, você pode simplesmente usar this e evite o me pessoalmente, acho que é confuso.Mas se você quiser seguir esse paradigma, use var me = this;

Seu exemplo não está muito claro, onde ocorre o erro?Você está ligando data.setXml() sem parâmetros, então me.xml apostará definida para undefined.Isso é esperado se você não passar nada para o método.

Lembre-se também de que, devido à natureza assíncrona da sua chamada, se você fizesse algo como:

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

data.getXML() naquele momento ainda estaria indefinido, pois é provável que sua chamada assíncrona ainda não tenha retornado, portanto, não definindo o atributo xml do seu objeto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top