bama: prototype für ein Objekt "ausschalten"

Hallo zusammen,

ich hätte da mal eine Frage prototype betreffend. Und zwar benutze ich eine kleine Javascript-Webanwendung und dort ist für Arrays ein prototype gesetzt. Jetzt habe ich da was dazu gefrimelt und würde den prototype gerne für dies eine Array "ausschalten". Wie kann man das tun? Gibt es sowas wie "unbind"?

hoffentlich weiß jemand weiter.

schönen Abend,
bama

  1. ich hätte da mal eine Frage prototype betreffend. Und zwar benutze ich eine kleine Javascript-Webanwendung und dort ist für Arrays ein prototype gesetzt. Jetzt habe ich da was dazu gefrimelt und würde den prototype gerne für dies eine Array "ausschalten". Wie kann man das tun? Gibt es sowas wie "unbind"?

    Nein. Und ohne zu wissen was du wirklich willst läßt sich deine Frage auch nicht beantworten.

    Struppi.

    1. hallo Struppi,
      danke für die Antwort.
      ok, dann erzähle ich mal was ich will.
      dieser Prototype hängt an jedes Array einen Eintrag hinten dran.
      Jetzt habe ich Daten in ein Array eingelesen und wollte sie in einer Selectbox darstellen. Das hat geklappt. Allerdings hängt da jetzt in dieser Selectbox dieser Eintrag hinten dran, den man auch auswählen kann.
      Ich habe jetzt bevor ich mein Array anlege gesagt:
      Array.prototype.Name = null;
      Aber jetzt hängt hinten in meiner Selectbox ein auswählbarer leerer Eintrag, was auch nicht wirklich toll ist...
      Hat dazu jemand eine Idee? Wie könnte man den Eintrag in diesem einen Array wegbekommen?

      danke,
      bama

      1. Hallo,

        dieser Prototype hängt an jedes Array einen Eintrag hinten dran.

        Häääääh? :)

        prototype ist ein Objektname, über dieses Objekt kann man allen Array-Objekten Member (Eigenschaft oder Methode) hinzufügen.

        Was hat nun das prototypische Erweitern von Objekten mit dem Hinzufügen von Array-Einträgen (das ist was ganz anderes!) zu tun?

        Jetzt habe ich Daten in ein Array eingelesen und wollte sie in einer Selectbox darstellen. Das hat geklappt. Allerdings hängt da jetzt in dieser Selectbox dieser Eintrag hinten dran, den man auch auswählen kann.

        Ich kapier das nicht. Wenn du einen Array normal durchläufst, taucht doch nicht die prototypisch vererbte Eigenschaft auf.

        Array.prototype.bla = "blub";
        var myarr = [1, 2, 3];
        for (var i = 0; i < myarr.length; i++) {
           alert(myarr[i]);
        }

        Dabei taucht doch nicht blub auf?!

        Kann es sein, dass du eigentlich gar nicht Arrays meinst, sondern bloße Objects? Und du »durchläufst« den Array nicht über array[index], sondern mit einer for-in-Schleife? Dann müsstest du aber noch viel mehr Member bekommen, mit denen du nix anfangen kannst...

        Mathias

        1. Hi,

          hab' mich wohl mal wieder schleierhaft ausgedrückt...
          dann ist wohl eine Methode prototypisch ans Array gefügt, welches einen Eintrag macht, den ich in diesem Array nicht gebrauchen kann. Aber jedes andere Array braucht diesen Eintrag.

          Kann es sein, dass du eigentlich gar nicht Arrays meinst, sondern bloße Objects? Und du »durchläufst« den Array nicht über array[index], sondern mit einer for-in-Schleife?

          Eigentlich durchlaufe ich das Array mit einer "indexschleife" nicht mit for-in.

          keine Ahnung wie ich mein Problem anders beschreiben soll... Ich lese also meinen Kram in ein Array ein. So:

          bereich = Array();
          for(i=0;i<section.length;i++){
             bereich[section[i]] = section[i];
          }

          wenn ich das mit alert ausgebe, kommen auch nur die daten die ich brauche zum Vorschein. Wenn ich meine Bereiche in die Selectbox hänge ist der Eintrag da... und das hat mit der Prototype-Sache zu tun.

          danke,
          bama.

          1. Hallo,

            dann ist wohl eine Methode prototypisch ans Array gefügt, welches einen Eintrag macht, den ich in diesem Array nicht gebrauchen kann.

            Gnarf, genau das ist eben ausgeschlossen!
            Wenn du alle Arrays prototypisch erweiterst, ändert das an den Einträgen (Elementen) der Arrays gar nichts. Das geht gar nicht. Wenn es doch so scheint, dann hast du irgendwo einen anderen Fehler gemacht.

            keine Ahnung wie ich mein Problem anders beschreiben soll... Ich lese also meinen Kram in ein Array ein. So:

            bereich = Array();
            for(i=0;i<section.length;i++){
               bereich[section[i]] = section[i];
            }

            Was ergibt section[i]? Doch keine Zahl, oder? Wenn nein: Dann ist bereich auch kein wirklicher Array (weil seine Fähigkeiten als Array nicht genutzt werden), sondern wie von mir vermutet bloß ein Object (in anderen Sprachen nennt man das Hash, halt eine ungeordnete Name-Wert-Liste). Mit objekt["membername"] hängt man einem beliebigen Objekt (Arrays sind auch nur Objekte) eine Eigenschaft bzw. Methode an.

            Wenn section[i] also "bla" ergibt, dann kommt bereich["bla"] heraus, was dem Objekt eine Eigenschaft namens bla anhängt. Mit den Einträgen des Arrays hat das nichts zu tun. Der Array hat weiterhin eine length von 0.

            wenn ich das mit alert ausgebe, kommen auch nur die daten die ich brauche zum Vorschein. Wenn ich meine Bereiche in die Selectbox hänge ist der Eintrag da... und das hat mit der Prototype-Sache zu tun.

            Zeig mal bitte den gesamten relevanten Quellcode und beschreib, was du damit machst.

            Vielleicht zur Verdeutlichung:

            Wenn du objekt["string"] schreibst, legst du immer eine Eigenschaft, also ein Unterobjekt an. Ob bei einem Array-Objekt oder einem sonstigen.

            var arr = new Array;  
            arr["bla"] = "foo"; // Unter-Objekt (Eigenschaft)  
            arr[0] = "bar"; // Array-Element  
              
            for (var i = 0; i < arr.length; i++)  
              alert(i + ": " + arr[i]); // gibt 0: bar aus, nicht foo
            

            Wenn man nun prototypisch erweitert, dann wirkt sich nicht auf die Array-Elemente aus:

            Array.prototype.eigenschaft = "wert";  
              
            for (var i = 0; i < arr.length; i++)  
              alert(i + ": " + arr[i]); // gibt ebenfalls nur 0: bar aus
            

            Mathias

      2. dieser Prototype hängt an jedes Array einen Eintrag hinten dran.

        Das klingt erstmal nach Array.push.

        Jetzt habe ich Daten in ein Array eingelesen und wollte sie in einer Selectbox darstellen. Das hat geklappt. Allerdings hängt da jetzt in dieser Selectbox dieser Eintrag hinten dran, den man auch auswählen kann.

        Dann lösche doch den unerwünschten Eintrag mittels Array.splice (o.ä.).

        Ich verstehe nicht, wozu du das Array-Objekt prototypisch erweitern willst, wenn es offenbar nur um ein einzelnes Arrayelement geht.

        Siechfred

        --
        Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
        1. hi,

          Dann lösche doch den unerwünschten Eintrag mittels Array.splice (o.ä.).

          ich hatte es mit Array.pop() versucht, aber auch das funktioniert nicht. Ist als wäre nichts passiert...ich verstehe nicht warum das nicht funktioniert.

          Ich verstehe nicht, wozu du das Array-Objekt prototypisch erweitern willst, wenn es offenbar nur um ein einzelnes Arrayelement geht.

          Siehe erster Beitrag. Ich wollte nix prototypisch erweitern. Sondern das war schon so und ich will nur meine daten einlesen, und da stieß ich eben auf dieses Problem.

          Noch eine Idee?

          nochmals danke,
          bama

          1. gruss bama,

            Noch eine Idee?

            moeglicherweise liegt die ursache Deines problems gar nicht beim
            array, sondern in der art und weise, wie auf das [HTMLSelectElement]
            zugegriffen wird - dazu muesstes Du folgende dinge offenlegen:

            • Dein array, welches zumindest auszugsweise testdaten enthaelt,
            • die von Dir erwaehnte erweiterung von [Array.prototype],
            • den html-quellcode Deiner select-box,
            • den gesamten javascript-code, der fuer die manipulation dieser
                box zustaendig ist.

            besser noch waere ein online verfuegbarer testcase, der auf die
            gerade genannten punkte zurechtgeschrumpft wurde.

            so long - peterS. - pseliger@gmx.net

            --
            »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
            Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
            ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]