Avatar billede the_saint Nybegynder
17. januar 2007 - 17:37 Der er 9 kommentarer og
1 løsning

Objects, this referere til en funtion og ikke objectet

Jeg har lavet en classe i JS der ser således ud:
game = function()
{
    this.myVar = "OK";

    this.test = function()
    {
        doSomething = function()
        {
            this.myVar = "NOT OK";
        }   

        doSomething();
    }
}

-------------------------------------
this i methoden doSomething, referere til functionen "doSomething", og ikke objectet/Classen.

Hvordan får jeg den til det, eller hvad har jeg gjort forkert, hvordan bør jeg lave det? eller findes der en anden ting som ALTID refere til øverste object?
Avatar billede htm Nybegynder
17. januar 2007 - 20:37 #1
this vil altid refere til den aktuelle funktion / objekt. Du kan referer til objektet ved at lave en variable inden funktion og sætte den lig this. i det tilfælde her vil me altid referer til objektet.

game = function()
{
    this.myVar = "OK";
    var me = this;

    this.test = function()
    {
        doSomething = function()
        {
            me.myVar = "NOT OK";
        } 
        doSomething();
    }
}

Personligt ville jeg ikke smide så mange funktioner inde i hinanden, men det er jo en smagssag.
Avatar billede the_saint Nybegynder
17. januar 2007 - 20:44 #2
Det er første gang jeg bruger JS som OOP.. men findes der en bedre måde.. min classe ser således ud indtil videre:

game = function(game_id, user_id)
{
    this.game_id = game_id;
    this.user_id = user_id;
    this.isFlying = false;
   
    var me = this;
    var objHTTP;
   
    this.ping = function()
    {
    }
   
    this._getLoader = function()
    {
        return document.getElementById("ajax_loader");
    }
   
    this.startPing = function()
    {
        if(this.isFlying == false) this.ping();
       
        setTimeout("this.startPing()", 1000);
    }
   
    this.joinGame = function()
    {
        myFunc = function()
        {
            if(objHTTP.readyState == 4 || objHTTP.readyState == "complete")
            {
                if(objHTTP.responseText == "OK")
                {
                    alert("ALT OK");
                    me._land();
                }
                else
                {
                    alert(objHTTP.responseText);
                }
            }
        };
        this.openHTTP("game_action.php?game_id="+game_id+"&action=join_game", myFunc);
    }
   
    this.setSeed = function(url)
    {
        var arrURL = url.split("?");       
        var arrQStrings = arrURL[1].split("&");
        var strNewURL = "";
        if(arrQStrings.length == 0)
        {
            strNewURL = url+"?sid="+Math.random();
        }
        else if(arrQStrings.length == 1)
        {
            strNewURL = url+"&sid="+Math.random();
        }
        else
        {
            for(var i in arrQStrings)
            {
                if(arrQStrings[i])
                {
                    if(arrQStrings[i].indexOf("sid") == -1)
                    {
                        strNewURL = strNewURL + "&" + arrQStrings[i];
                    }
                }
            }
            strNewURL = arrURL[0] + "?" + strNewURL + "&sid="+Math.random();       
        }
       
        return strNewURL;
    }
   
    this.openHTTP = function(url, postFunction)
    {
        objHTTP = this._getHTTP();
        this._fly();
        objHTTP.onreadystatechange = postFunction;
        objHTTP.open("GET", this.setSeed(url), true);
        objHTTP.send(null);
    }
   
    this._getHTTP = function()
    {
        var browser = navigator.appName;
        if(browser == "Microsoft Internet Explorer"){
            return new ActiveXObject("Microsoft.XMLHTTP");
        }else{
            return new XMLHttpRequest();
        }
    }
   
    this._fly = function()
    {
        this.isFlying = true;
        this._getLoader().style.display = "block";
        alert("Letter");
    }
   
    this._land = function()
    {
        this.isFlying = false;
        this._getLoader().style.display = "none";
        alert("Lander");
    }
}
Avatar billede htm Nybegynder
17. januar 2007 - 20:52 #3
Jeg foretrækker denne model:

function foo()
{
  this.bar = "hello";
}

var _f = foo.prototype;

_f.sayHello = function()
{
  alert(this.bar);
}
Avatar billede the_saint Nybegynder
17. januar 2007 - 20:55 #4
Den har jeg aldrig forstået hvordan den fungere :S
Avatar billede htm Nybegynder
17. januar 2007 - 21:04 #5
// Opret objektet ved navn foo
function foo()
{
  //Opret en variable i objektet ved navn bar og sæt indholdet til hello
  this.bar = "hello";
}

//Opret en reference til objektets prototype, så vi kan bruge en kortere form til nye funktioner
var _f = foo.prototype;

//Vi bruger vores prototype variable og så laver vi en ny funktion til objektet.
_f.sayHello = function()
{
  alert(this.bar);
}

Du kan også udelade var _f = foo.prototype; så skal funktionen så bare oprettes således:
foo.sayHello = function()
{
  alert(this.bar);
}

Håber det gav et lidt bedre indsigt i det :-)
Avatar billede the_saint Nybegynder
17. januar 2007 - 21:10 #6
Men, hvis jeg så skal oprette en "variable" som indeholder en funktion, ligesom jeg gør i øverste eksempel - (Den skal jeg bruge til min onreadystatechange funktion).. hvordan gør jeg så det?
Avatar billede htm Nybegynder
17. januar 2007 - 21:33 #7
Ved eks. objHTTP.onreadystatechange kan du oprette funktionen på to måder.

som du gør:
objHTTP.onreadystatechange = functionNavn
den vil så kalde funktionen functionNavn() du kunne også skrive this.functionNavn så referer den til en funktion i objektet.

eller:
objHTTP.onreadystatechange = function(){ //do something };

Men er ikke sikker på jeg forstår hvad du mener :)
Avatar billede the_saint Nybegynder
17. januar 2007 - 21:35 #8
Jeg vil oprette en funktion som modtager 2 parametre, url og en function den skal udføre når den er færdig.. det var derfor jeg lavede myFunc = function (){ GØR NOGET }

Og sendte den med som parameter...
Avatar billede the_saint Nybegynder
17. januar 2007 - 21:45 #9
Opretter du et svar? :)
Avatar billede htm Nybegynder
17. januar 2007 - 21:53 #10
For at kalde funktionen fooBar ved onreadystatechange med parametre skal du nok gøre sådan:
objHTTP.onreadystatechange = function() { fooBarFunc(param1, param2); };
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester