Klaus: Frage zu Prototypen

Guten Abend,

  
function Mensch(name) {  
  this.name=name;  
}  
var klaus1=new Mensch('Klaus1');  
// ... erzeuge 1000 weitere Menschen  
var klaus1000=new Mensch('Klaus1000');  
Mensch.prototype.alter=30   // wird hier a) 'alter' in allen tausend Mensch-Instanzen erzeugt, oder b) nur einmal, im Mensch-Prototypen?  
klaus1000.alter=40;   // wenn b), wird hier ein spezifisches Alter von klaus1000 erzeugt, das das Alter des Prototypen überdeckt?  

wenn b) wahr ist, ist obige schreibweise folglich ressourcensparender(wenn ich nicht allen Mensch-Instanzen ein unterschiedliches Alter zuweise) als nachfolgende?

  
function Mensch(name)  
{  
  this.name=name;  
  this.alter=30;  
}  
var klaus1=new Mensch('Klaus');  
// ... erzeuge 1000 weitere Menschen  
var klaus1000=new Mensch('Klaus1000');  
klaus1000.alter=40;  

Gruß, Klaus

  1. Lieber Klaus,

    was Dein Vorhaben angeht, so ist das Verwenden von Prototyping im Ergebnis das Gleiche (wenn auch nicht dasselbe), wie wenn Du die damit vergebene Eigenschaft gleich im Konstruktor vergibst.

    Nach meiner Erfahrung verwendet man Prototyping dann, wenn man Objektarten um weitere Funktionalitäten erweitern möchte, deren Konstruktoren man nicht selbst geschrieben hat und von daher auch nicht wirklich "dran kommt". Besonders dann, wenn man Fremdbibliotheken einbindet, die ihrerseits Konstruktoren bieten, will man diese Bibliotheken nicht verändern, nur damit die in den dortigen Konstruktoren erzeugten Objekte das erhalten, was ich ihnen zusätzlich geben will.

    Beispiel:

    <script type="text/javascript" src="/libs/fremdlib.js"></script>  
    <script type="text/javascript">//<![CDATA[
    
        var klaus = new FremdLib.Mensch("Klaus");  
        var peter = new FremdLib.Mensch("Peter");  
      
        klaus.alter = 40;  
        peter.alter = 17;  
    //]]>
    ~~~`</script>`{:.language-html}  
      
    Liebe Grüße,  
      
    Felix Riesterer.
    
    -- 
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    
    1. Jaja, zu früh den Absendebutton erwischt.

      Beispiel:

      <script type="text/javascript" src="/libs/fremdlib.js"></script>

      <script type="text/javascript">//<![CDATA[

      
      > ~~~javascript
      
          var klaus = new FremdLib.Mensch("Klaus");  
      
      >     var peter = new FremdLib.Mensch("Peter");  
        
            FremdLib.Mensch.prototype.alterAusgeben = function () {  
                alert(this.alter);  
            };  
        
      
      >     klaus.alter = 40;  
      >     peter.alter = 17;  
      > //]]>
      
      ~~~`</script>`{:.language-html}  
        
      Liebe Grüße,  
        
      Felix Riesterer.
      
      -- 
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      
  2. Zu deinem Beispiel:
    A. belegt 999 * den Speicherplatz für einen Integer weniger als B.
    Die Antwort auf deine Frage ist also Ja.

    Ein Prototype ist mehr oder weniger auch nur ein normales Object auf das alle Instanzen des Prototypes verweisen.

    Noch ein Beispiel:

      
    function Foo(bar) {  
      if (bar && bar !== this.bar) {  
         this.bar = bar;  
      }  
    }  
    Foo.prototype.bar = 'Foos bar';  
      
    foo = new Foo;  
    bar = new Foo(Foo.prototype.bar);  
    baz = new Foo('baz');  
      
    console.log(foo,bar,baz);  
      
    Foo.prototype.bar = null;  
      
    console.log(foo,bar,baz);  
      
    delete baz.bar;  
      
    console.log(baz);  
    
    
    1. Vielen Dank!
      +hilfreich vom Unregistrierten.

      Habe dein Beispiel mal, um es zu verstehen, in mein Klaus-Beispiel konvertiert.
      Ich verwende JSON.stringify, weil [object Object] so unleserlich ist.

        
      function log() { // Tipparbeit sparen  
          s = '';  
          for(c=0; c<arguments.length; c++) {  
              if (c == 0) {  
                  s += arguments[c]+': ';  
              } else {  
                  s += JSON.stringify(arguments[c]);  
                  if (c < arguments.length-1) {  
                      s += ',';  
                  }  
              }  
          }  
          console.log(s);  
      }  
        
        
        
      function ClassicKlaus(alter){  
          if(alter) {  
              this.alter=alter;  
          } else {  
              this.alter=35;  
          }  
      }  
        
      function SmartKlaus(alter) {  
          if(alter && alter!==this.alter) {  
              this.alter=alter;  
          }  
      }  
      SmartKlaus.prototype.alter=30;  
        
      var ck1 = new ClassicKlaus();  
      var ck2 = new ClassicKlaus();  
      var ck3 = new ClassicKlaus(40);  
        
      var sk1 = new SmartKlaus;  
      var sk2 = new SmartKlaus;  
      var sk3 = new SmartKlaus(40);  
        
      console.log('Alles über Klaus:')  
      log('Classic Klaus 1, 2 und 3', ck1, ck2, ck3);  
      log('Smart Klaus 1, 2 und 3', sk1, sk2, sk3);          // bei sk2 und 3 wird Speicherplatz gespart ...  
      log('Smart Klaus Prototype', SmartKlaus.prototype); // .. weil stattdessen hier nachgeguckt wird  
        
      console.log('Das Alter jedes Klaus:')  
      log('Classic Klaus 1, 2 und 3', ck1.alter, ck2.alter, ck3.alter);  
      log('Smart Klaus 1, 2 und 3', sk1.alter, sk2.alter, sk3.alter);  
      log('Smart Klaus Prototype', SmartKlaus.prototype.alter);  
        
      SmartKlaus.prototype.alter=35  
      console.log('Nochmal das Alter jedes Klaus (jetzt mal ehrlich):')  
      log('Classic Klaus 1, 2 und 3', ck1.alter, ck2.alter, ck3.alter);  
      log('Smart Klaus 1, 2 und 3', sk1.alter, sk2.alter, sk3.alter);  
      log('Smart Klaus Prototype', SmartKlaus.prototype.alter);  
      
      

      Gruß, Klaus, der Smarte :-D

  3. [latex]Mae  govannen![/latex]

    Alternativer Ansatz:

      
    // Schablone  
    // hier als Beispiel bewußt einfach gehalten  
    var Mensch = {  
        name: 'unbenanntes Neugeborenes',  
        alter: 0,  
        niesen: 'Hatschi',  
        niest: function () {  
            console.log(this.name + ' macht ' + this.niesen);  
        },  
        init: function (props) {  
            for (var prop in props) {  
                if (props.hasOwnProperty(prop) && prop != 'init') {  
                    this[prop] = props[prop];  
                }  
            }  
            return this;  
        }  
    };  
      
    var hans = Object.create(Mensch).init({  
        name: 'Hans',  
        alter: '100',  
        niesen: 'BruuhaaaatschiiiiAhhh'  
    });  
      
    var katja = Object.create(Mensch).init({  
        name: 'Katja',  
        alter: '22',  
        niest: function () {  
            alert('haa....');  
        }  
    });  
      
    var peter = Object.create(Mensch).init({  
        name: 'Peter',  
        alter: '34'  
    });  
      
    var jemand = Object.create(Mensch).init({  
        niesen: 'tschi'  
    });  
      
    console.log(peter.name, peter.alter);  
    peter.niest();  
    console.log(hans.name, hans.alter);  
    hans.niest();  
    console.log(katja.name, katja.alter);  
    katja.niest();  
    console.log(jemand.name, jemand.alter);  
    jemand.niest();
    

    Es wurde nur der erste Parameter von Object.create verwendet, um mit dem Polyfill auch ältere Browser bedienen zu können. Als "Quasi-Ersatz" wird die init-Funktion benutzt.

    Stur lächeln und winken, Männer!
    Kai

    --
    „Die Borg würden nicht mal Spaß verstehen, wenn sie einen Vergnügungspark assimiliert hätten!” (B'Elanna Torres)
    SelfHTML-Forum-Stylesheet