Prototype Funktion schreiben (theorie)

yuro

Erfahrenes Mitglied
Hallo,

und zwar brauche ich ein bisschen theoretische Hilfe. In der Aufgabe soll eine eingebaute Funktion each() vervollständigt werden. Das Ergebnis von summe() soll 25 sein.


Javascript:
var arr = [ '3',  4 ], arr.each( function (x) { return x*x; } ), erg = arr.summe(); 


  ______________.prototype.summe = function() {


  var i, sum = 0, arr = _______________;

 

  for (i = 0; i < ___________.length; i += 1) {


  ___________________________________________

  } return sum;

  }

  //- - - - - - - - Bitte erg�nzen - - - - - - - - - - - - - - - -


  ______________.prototype.each = function (fn) {

  var i, sum = 0, arr = _______________;


  for (i = 0; i < ___________.length; i += 1) {


  ___________________________________________

  }

  }

Vor den Prototypes hätte ich "String" notiert und die Länge des arr ausgelesen aus der For-Schleife, also arr.length und in der Vorschleife sum = arr;.. zumindest bei der "summe"-Funktion oben. Stimmt das ungefähr??
 
Hallo,

ohne zu sehen, wie "summe" aufgerufen wird, kann ich dir leider nicht helfen.
each scheint im Zusammenhang mit Arrays zu stehen. Diese Funktion wurde allerdings in JavaScript vor ein paar Jahren verwirklicht. Anscheinend ist die Aufgabe etwas in die Jahre gekommen :)
 
Hallo ComFreek,

Also das ist der gesamte Code der Aufgabe.. in die Lücken sollen jeweils die Variablen reingeschrieben werden.

Javascript:
String.prototype.summe = function() {
  var i, sum = 0, arr = _______________;
  for (i = 0; i < arr.length; i += 1) {
  sum = arr[i];
  } return sum;
}

Bin mir aber nicht sicher ob das richtig ist?!

also praktisch wird ausm arr = ['3', 4] in die each() Funktion 3*3 und 4*4 genommen und das ergebnis addiert und dann kommt die Summe 25 raus.
 
Zuletzt bearbeitet:
Hi,

ich denke, die Erweiterung des Prototypen bezieht sich auf das Array-Objekt.

In der ersten Funktion soll die Verarbeitung eines Wertes mit Rückgabe, in der zweiten Variante die Verarbeitung einer übergebenen Funktion umgesetzt werden.

Ohne Garantie auf Richtigkeit würde ich die Aufgabe wie folgt lösen:
Javascript:
Array.prototype.each = function(fn) {
    var i, sum = 0,
        arr = this;


    for (i = 0; i < arr.length; i += 1) {
        arr[i] = fn(Number(arr[i]));
    }

    return arr;
}


Array.prototype.summe = function() {
    var i, sum = 0,
        arr = this;

    for (i = 0; i < arr.length; i += 1) {
        sum += Number(arr[i]);
    }

    return sum;
}

arr = ['3', 4];
arr.each( function (x) { return x*x; } );
arr.summe();
Ciao
Quaese
 
Hej Quaese,

danke dir für deine hilfreiche antwort :)

Wie wäre es dann bei dem Object Beispiel?

Javascript:
var obj = { a:3, b:"4" },
  obj.each( function (x) { return x*x; } ),
  erg = obj.summe();       // das Ergebnis erg = 25 ist.  

---code-anfang---

          ____________.prototype.summe = function() {

            var ____________________________

            for (___________________________) {

              if ( obj._______________________(key)) {
                sum += +obj[key];
              }
            } return sum;
          }
          //- - - - - - - - Bitte erg�nzen - - - - - - - - -

          ________________.prototype.each = function(fn) {

            var ____________________________

            for (___________________________) {

              if ( obj._______________________(key)) {

                 ___________________________________
              }
            }
          }

Da müsste dann Object.prototype wahrscheinlich hin..
var i, sum = 0, obj = { a:3, b:"4" };
for(i=0;i<obj.length;i++)
 
Hallo,

bei Object ist es nun ein wenig schwieriger als beim Array.

Object.prototype muss hin, das ist klar.
Allerdings hat ein Object keine "length"-Eigenschaft und in der Hinsicht auf keine Elemente, die klar mit einem fortlaufenden Index versehen sind.
Kennst du die for...in-Schleife?

Außerdem - dafür ist das if innerhalb der Schleife da - muss du achtgeben, dass du nur über die eigenen Eigenschaften und nicht über "vererbte" Eigenschaften (mittels Prototypechains) iterierst.
 
ja die for in Schleife hab ich auch schon im Einsatz gesehen... Hast mich wieder dran erinnert dank dir :)

Kann ich eigtl beim Beispiel von Quaese statt Number() auch parseInt() nehmen??
 
Völlig austauschbar ist es nicht: http://stackoverflow.com/a/17106702/603003

Aber sofern du nur simple Dezimalzahlen in der unten beschriebenen Form hast, sollten beide Wege völlig äquivalent sein:
Code:
Zahl = [Optionales Minus] [Beliebige Ziffern]
Wobei es bei ECMAScript (ES) < 5 wieder eine Ausnahme bei parseInt() gibt, wenn kein Radix angegeben wird.
Wenn du parseInt() verwendest, würde ich die Angabe des Radix empfehlen (sofern du nicht ES >= 5 annehmen kannst):
Javascript:
var number = parseInt(string, 10);
 
Zurück