Ergebnis 1 bis 9 von 9
  1. #1
    cybersound ist offline Grünschnabel
    registriert
    29-03-2009
    Ort
    Saarland
    Beiträge
    4

    Objekte und prototyp

    hallo leute,

    Ich hab ein Verständnisproblem, und zwar gehts darum wie ich in Js eine "klasse" definiere

    in etlichen Büchern ist es (ungefähr) so dargestellt:

    (Google Buchsuche is echt was edles )

    Code:
    var meinObject = function()    {   
    
    }
    
    meinObject.prototyp.methode1 = function() {
    
    ...
    
    }
    
    
    meinObject.prototyp.methode2 = function() {
    
    ...
    
    }
    wenn ich das richtig verstanden habe referenziert das prototyp-attribut auf ein Object dessen Eigenschaften übernommen werden (vererbung) warum leg ich dan eine neu methode mit

    meinObject.prototyp.methode2 = function() {}

    an und nicht so

    meinObject.methode2 = function() {}

    das erste würde ja bedeuten das ich die Superklasse erweitern würde und nicht die klasse die ich eigentlich erweitern will.

    Wäre echt toll wenn mir jemand helfen könnte, wenn nicht trozdem danke fürs lesen

  2. #2
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Objekte und prototyp

    prototype ist, wie der Name schon sagt, der Prototyp eines Objekts (Klassen gibt es nicht in JS - das ist aber eine müßige Diskussion, letztlich geht nur um die Bezeichnung).

    D.h. der prototyp ist das, was das Objekt "hat", wenn du es erzeugst.

    Superklasse, wäre die Klasse, die in einer Vererbungshierachie als erste kommt.

    und objekt.eigenschaft ist einfach nur eine Eigenschaft der spezifischen Instanz.

  3. #3
    cybersound ist offline Grünschnabel
    registriert
    29-03-2009
    Ort
    Saarland
    Beiträge
    4

    AW: Objekte und prototyp

    vielen dank für die hilfe, aber jetzt hast du mein verständnis das ich mir mühevoll zusammengerafft hab zerstört

    prototyp ist doch eine attribut das jedes Objekt von dem Object Object erbt,

    sprich es ist ein attribut das jedes Object hat und es zeigt auf ein anderes Object. im Standartfall auf das Object Object

    angenommen ich hab jetzt ein Object namens objB mit den methoden m2 und m3

    wenn ich jetzt die methode objB.m1() aufrufe wird der Interpreter diese In ObjB nicht finden also schaut er automatisch in dem Prototyp Object nach ob es dort exsestiert. also kann ich so eine Vererbungshirarchie aufbauen.

    angenommen ich hab noch ein Object namens ObjA mit methode m1

    und ich mache jetzt sowas

    objB.prototyp = new objB();

    dann functioniert das hier wunderbar

    objA.m1();

    obwohl m1 in objB ist und nicht in objA

    wenn ich jetzt objB um eine methode erweitern will hab ich schon oft gesehen das es so gemacht wird

    objB.prototyp.neueMethode = function() {}

    aber objB.prototyp zeigt doch auf objA, somit würde ich doch ObjA erweitern ???

  4. #4
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.610

    AW: Objekte und prototyp

    Code:
    var meinObject = function()    {   
    
    }
    
    meinObject.prototyp.methode1 = function() {
    
    ...
    
    }
    
    
    meinObject.prototyp.methode2 = function() {
    
    ...
    
    }
    letztendlich willst du ja eine instanz von meinObject anlegen
    var inst = new meinObject();
    an diese instanz werden alle eigenschaften von meinObject.prototyp kopiert. meinObject.prototyp ist ja der prototyp. d.h methode1 hat auch die instanz als eigenschaft
    inst.methode1();
    ist ok
    methode2 ist nur eine eigenschaft an meinObject. du kannst also
    meinObject.methode2();
    aufrufen, aber
    inst.methode2();
    ist falsch

  5. #5
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.610

    AW: Objekte und prototyp

    Zitat Zitat von cybersound Beitrag anzeigen
    wenn ich jetzt objB um eine methode erweitern will hab ich schon oft gesehen das es so gemacht wird

    objB.prototyp.neueMethode = function() {}

    aber objB.prototyp zeigt doch auf objA, somit würde ich doch ObjA erweitern ???
    objB.prototyp ist eine instanz von objA. diese erweiterst du. du kanst jede belibige instanz erweitern, auch die von objB
    var instB = new objB();
    instB.m1 = new function(){};
    dann hat nur die instanz instB von objB diese function, nicht alle instanzen. das erreichst du aber wenn du
    objB.prototype.m1 = new function(){};
    var instB = new objB();
    schreibst

  6. #6
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Objekte und prototyp

    Zitat Zitat von cybersound Beitrag anzeigen
    vielen dank für die hilfe, aber jetzt hast du mein verständnis das ich mir mühevoll zusammengerafft hab zerstört
    Dachte ich mir schon


    Zitat Zitat von cybersound Beitrag anzeigen
    prototyp ist doch eine attribut das jedes Objekt von dem Object Object erbt,

    sprich es ist ein attribut das jedes Object hat und es zeigt auf ein anderes Object. im Standartfall auf das Object Object
    prototype ist ein spzielles Attribut, es wird nicht vererbt im OOP Sinn. Wenn du ein Objekt mit new erzeugst, bekommt (also erbt quasi) das Objekt die Eigenschaften die mit objekt.prototype definiert wurden.
    Zitat Zitat von cybersound Beitrag anzeigen
    und ich mache jetzt sowas

    objB.prototyp = new objB();

    dann functioniert das hier wunderbar

    objA.m1();

    obwohl m1 in objB ist und nicht in objA
    Du meinst

    PHP-Code:
    objA.prototyp = new objB(); 
    Ja, du hast recht, Das nennt sich prototypische Vererbung.

    Zitat Zitat von cybersound Beitrag anzeigen
    wenn ich jetzt objB um eine methode erweitern will hab ich schon oft gesehen das es so gemacht wird

    objB.prototyp.neueMethode = function() {}

    aber objB.prototyp zeigt doch auf objA, somit würde ich doch ObjA erweitern ???
    Ja das wird so gemacht. Das hat aber nichts mit erweitern zu tun.

    Der prototype ist der Prototyp der beim erzeugen einer Instanz verwendet wird. Wenn du ihn Methoden zuweist, werden alle Instanzen diese bekommen. Wenn du dem Prototyp eine Instanz zuweist, bekommt das Objekt alle Eigenschaften davon.

  7. #7
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.610

    AW: Objekte und prototyp

    Zitat Zitat von ein schlauer Beitrag anzeigen
    Das hat aber nichts mit erweitern zu tun.

    Der prototype ist der Prototyp der beim erzeugen einer Instanz verwendet wird. Wenn du ihn Methoden zuweist, werden alle Instanzen diese bekommen. Wenn du dem Prototyp eine Instanz zuweist, bekommt das Objekt alle Eigenschaften davon.
    Das hat schon was mit erweitern zu tun. man kann prototype ja auch eine Instanz und Methoden zuweisen. dann erweiterst du 1. deinen Prototyp um die Eigenschaften der instanz und 2. erweiterst du prototype um die Methode(n) solange bis du wieder eine Instanz zuweist, dann überschreibst du deinen prototype mit dieser und der rest ist weg.

    Code:
    function A()
    {
    
    }
    A.prototype.a = function() { };
    function B()
    {
    
    }
    B.prototype.b = function() { };
    function C()
    {
    
    }
    C.prototype = new A();
    C.prototype.c = function() { };  // erweitern um c
    c1 = new C();
    c1.a(); // OK
    c1.c(); // OK
    C.prototype = new B();
    c2 = new C();
    c2.b(); // OK
    c2.c(); // falsch

  8. #8
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Objekte und prototyp

    Zitat Zitat von hesst Beitrag anzeigen
    Das hat schon was mit erweitern zu tun. man kann prototype ja auch eine Instanz und Methoden zuweisen. dann erweiterst du 1. deinen Prototyp um die Eigenschaften der instanz und 2. erweiterst du prototype um die Methode(n) solange bis du wieder eine Instanz zuweist, dann überschreibst du deinen prototype mit dieser und der rest ist weg.
    Eben.
    Natürlich kann man in dem Sinn prototype erweitern, aber er schrieb:
    ...aber objB.prototyp zeigt doch auf objA, somit würde ich doch ObjA erweitern ???
    und wie du schon schriebst, man kann ein Objekt oder eine Instanz erweitern um Eigenschaften und Methoden.
    Aber beim Prototype würde ich nicht von der Erweiterung einer Instanz sprechen, das ist die Definition der Eigenschaften beim erzeugen einer Instanz, wenn ich prototype erweitere spielt das, wie dein Beispiel zeigt, nur beim erzeugen eine Rolle.

    JS ist schon kompliziert - zumal das ganze so ja auch noch eine Menge Fallstricke beinhaltet. z.b. die Vererbung mit new BaseObject(), die dazu führt, dass jede Instanz das gleiche BaseObject hat, was schnell zu Problemen führt, wenn im BaseObject Objekte erzuegt werden:

    PHP-Code:
    function Base() {
        var 
    privateObject = {};
        
    this.get = function() { return privateObject;};
    }
    function 
    A() {};
    A.prototype = new Base();

    var 
    o1 = new A();
    var 
    o2 = new A();

    alert( (o1.get() === o2.get())); // true 
    Was nur durch einen zusätzlichen Aufruf des Konstruktors im Kontext des neuen Obektes vermieden werden kann
    PHP-Code:
    function C() {
        
    Base.apply(this);
    };
    C.prototype = new Base();

    var 
    o1 = new C();
    var 
    o2 = new C();
    alert( (o1.get() === o2.get())); // false 

  9. #9
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.610

    AW: Objekte und prototyp

    Zitat Zitat von ein schlauer Beitrag anzeigen
    Natürlich kann man in dem Sinn prototype erweitern, aber er schrieb:
    dann hatte ich dich falsch verstanden. mir war schon klar, daß du irgendetwas anderes gemeint hattest, nur so wie es da stand, hat man(ich) es nicht verstanden.

    Zitat Zitat von ein schlauer Beitrag anzeigen
    Aber beim Prototype würde ich nicht von der Erweiterung einer Instanz sprechen, das ist die Definition der Eigenschaften beim erzeugen einer Instanz
    Ich meine, prototype selbst ist eine instanz (eines funktionsobjektes) und kein Typ. (ich komme halt aus der C++ welt, da hat man ein typ-instanz-konzept und auch wenn in JS die "Typen" selbst auch wieder objektinstanzen sind, denke ich nunmal in diesem schema - also alle mit new angelegten objekte sind für mich instanzen eines funktionsobjektes)

    Zitat Zitat von ein schlauer Beitrag anzeigen
    wenn ich prototype erweitere spielt das, wie dein Beispiel zeigt, nur beim erzeugen eine Rolle.
    nicht ganz. erweitern kann ich auch später. erst durch die zuweisung einer neuen Instanz an prototype, wird dieser "abgekoppelt"
    Code:
    function A()
    {
    
    }
    function C()
    {
    
    }
    c1 = new C();
    C.prototype.c = function() { };
    c2 = new C();
    c2.c(); // OK
    c1.c(); // auch OK
    alert (c1.constructor.prototype === c2.constructor.prototype); // true
    C.prototype = new A();
    c3 = new C();
    alert (c1.constructor.prototype === c3.constructor.prototype); // false

Ähnliche Themen

  1. Array für Objekte
    Von sladda im Forum JavaScript
    Antworten: 3
    Letzter Beitrag: 09-06-2008, 12:06
  2. Antworten: 1
    Letzter Beitrag: 21-03-2008, 12:07
  3. Muss ich erstellte Objekte löschen?
    Von gery im Forum Serverseitige Programmierung
    Antworten: 1
    Letzter Beitrag: 04-01-2008, 01:35
  4. Antworten: 13
    Letzter Beitrag: 08-04-2007, 14:07
  5. Objekte in JS
    Von GELight im Forum JavaScript
    Antworten: 4
    Letzter Beitrag: 02-01-2007, 15:09

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •