dr.colossos: this innerhalb von privater Methode?

Hi,

kann mir jemand sagen wie ich innerhalb einer PRIVATEN Methode das zugehoerige Objekt referenzieren kann?

Ich kriegs nicht hin, hier ein kleiner Test um das Problem zu verdeutlichen ...

function Test()
{
 // erwarteter output erscheint: "public->this = [object Object]"
 this.publicFunction = function()
 {
  alert("public->this = " + this);
 }

// erwarteter output erscheint NICHT, sondern: "private->this = [object Window]"
 function privateFunction()
 {
  alert("private->this = " + this);
 }
 this.publicFunction(); // liefert "public->this = [object Object]"
 privateFunction();  // liefert "private->this = [object Window]"
}
t = new Test();   // Objekt erzeugen
t.publicFunction();  // liefert "public->this = [object Object]"
t.privateFunction(); // liefert natuerlich Fehler, weil private Methode

Klar, ich koennte nur public Methoden schreiben, aber das is allenfalls ein workaround.

Was muss ich anders/besser machen?

Danke & Servus

  1. Moin!

    Klar, wenn die private Funktion aufgerufen wird, bezieht sich this nicht mehr auf das ehemalige Objekt. Daher mußt du den momentanen Bezug speichern:

    function Test()
    {

    var self = this; // meinetwegen auch was anderes, falls self nicht gefällt

    function privateFunction()
    {

    alert("private->this = " + self)

    }

    Cü,

    Kai

    --
    What is the difference between Scientology and Microsoft? One is an
    evil cult bent on world domination and the other was begun by L. Ron
    Hubbard.
    ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|
    1. Danke!

      Wer hat da von wem abgeschrieben, hehe ...

      Funktioniert wunderbar, danke an alle!

      "Klar, wenn die private Funktion aufgerufen wird, bezieht sich this nicht mehr auf das ehemalige Objekt."

      Also das "Klar" is hier garnicht klar fuer mich. Ich meine, so aus OOP-Perspektive heraus ...

      Aber ich denke ich versteh's schon.

      Beim Aufruf von "this.publicFunction();" funktioniert das wunderbar, weil das "this" davor steht, oder.

      Beim Aufruf von "privateFunction();" steht kein this davor, ist also im scope vom "window"-Object ... die Tatsache dass der Aufruf in der "Klasse" Test ist spielt anscheinend (leider) keine Rolle, korrekt ... halb-korrekt ... falsch?

      Danke!

      1. Wer hat da von wem abgeschrieben, hehe ...

        Das frag ich micht auch ;-)

        Beim Aufruf von "privateFunction();" steht kein this davor, ist also im scope vom "window"-Object ... die Tatsache dass der Aufruf in der "Klasse" Test ist spielt anscheinend (leider) keine Rolle, korrekt ... halb-korrekt ... falsch?

        100%

        Struppi.

      2. Hallo,

        "Klar, wenn die private Funktion aufgerufen wird, bezieht sich this nicht mehr auf das ehemalige Objekt."

        Also das "Klar" is hier garnicht klar fuer mich. Ich meine, so aus OOP-Perspektive heraus ...

        JavaScript hat kein fest definiertes, eingebautes, klassenbasiertes OOP wie andere Sprachen.

        Es gibt die Unterscheidung zwischen privaten und öffentlichen Methoden in JavaScript erstmal nicht. Nur durch einen Trick kann man die Funktionalität »privater« Methoden nachbauen. Dabei macht man sich gewisse interne JavaScript-Features zu nutze (Closures). Closures wurden dir übrigens auch wieder empfohlen, um in den »privaten« Methoden trotzdem Zugriff auf das Instanz-Objekt zu haben.

        Beim Aufruf von "this.publicFunction();" funktioniert das wunderbar, weil das "this" davor steht, oder.

        Das Schlüsselwort »this« verweist immer auf das globale Objekt (window), außer in dem einen Fall, dass eine Funktion über objekt.funktion() aufgerufen wird. Entscheidend ist diese Schreibweise und die darin ausgedrückte Objekt-Unterobjekt-Beziehung. (Wenn man dasselbe Funktionsobjekt anders referenziert, dann zeigt this nicht aufs Objekt, an dem das Funktionsobjekt hängt.)

        Beim Aufruf von "privateFunction();" steht kein this davor, ist also im scope vom "window"-Object ... die Tatsache dass der Aufruf in der "Klasse" Test ist spielt anscheinend (leider) keine Rolle, korrekt ... halb-korrekt ... falsch?

        Klassen gibt's wie gesagt in JavaScript nicht, es gibt JavaScript-intern auch keine Beziehung »Klasse hat private Methode« oder »Instanz hat private Methode«. JavaScript kennt nur die Beziehung von Objekt zu Unterobjekt (Member). Nur »öffentliche Methoden« sind Unterobjekte des Instanz-Objektes.

        *Wo* irgendeine Funktion aufgerufen wurde, ist also egal. Damit »this« in einer Funktion auf die Instanz zeigt, muss diese ein Member der Instanz sein und auch über instanz.methode() aufgerufen werden. Das ist bei »privaten Methoden« eben unmöglich.

        Mathias

        1. Hi,

          danke sehr fuer die ausfuerhliche Beschreibung!

  2. kann mir jemand sagen wie ich innerhalb einer PRIVATEN Methode das zugehoerige Objekt referenzieren kann?

    Das geht nur über einen Umweg.

    function Test()
    {

    var self = this;

    // erwarteter output erscheint NICHT, sondern: "private->this = [object Window]"
    function privateFunction()
    {

    alert("private->this = " + self);

    }

    Struppi.

  3. Hi,

    kann mir jemand sagen wie ich innerhalb einer PRIVATEN Methode das zugehoerige Objekt referenzieren kann?

    Ueber eine private Variable, die auf die Objektinstanz referenziert.

    var myObject = new function() {  
      var myOwnInstance = this;  
      
      var privateFunction = function() {  
        alert(myOwnInstance);  
      }  
    }
    

    MfG ChrisB