peterS.: Verhalten nicht instanziierend aufgerufener Konstruktor-Funktion

Beitrag lesen

gruss Flo,

obwohl Du ja schon sanft vom himmel geholt wurdest, kriegst Du von mir
auch noch ein paar warme worte hinterhergereicht.

... Der Sinn ist, dass eine Funktion, wenn sie prozedural aufgerufen
wurde, eine Instanz von sich selbst zurückgibt. ...

wie schon von molily und Struppi bemerkt, willst Du das nicht wirklich;
und es gibt sehr gute gruende, soetwas nicht zu implementieren.

schon die sprachkernobjekte [[Boolean]], [[Number]] und [[String]]
haben ihre berechtigung sowohl als konstruktoren von instanzen des
jeweiligen objekttyps ([Boolean], [Number] und [String]) als auch
als *typecast*-funktionen, die jegliche ihnen zugefuehrte objekte
bzw. primitive werte in die wiederum primitiven werte [boolean],
[number] bzw. [string] zwingen.

  • beispiel - einfach mal ausprobieren:

~~~javascript var num1 = new Number(20); alert(typeof num1); // "object"
  var num2 = Number("20"); alert(typeof num2);   // "number"
  var num3 = Number(num1); alert(typeof num3);   // "number"

alert(num1 == num2);  // true  - impliziter typecast von "==".
  alert(num1 === num2); // false - "===" unterdrueckt typecasting.
  alert(num2 == num3);  // true  - war zu erwarten - werte sind gleich.
  alert(num2 === num3); // true  - werte sind eben auch vom gleichen typ.

  
  [num1] unterscheidet sich von [num2] und [num3] betraechtlich.  
  [num1] ist zwar zu [num2] und [num3] wert- aber nicht typgleich.  
  [num2] und [num3] hingegen sind sowohl wert- als auch typgleich.  
  
  
zurueck zum thema - da es diesen dualismus wie man sieht schon (und  
auch berechtigterweise) gibt, ist davon abzuraten, konstruktoren  
selbstgestrickter objekttypen anders als die oben beispielhaft  
angefuehrten zu implementieren.  
dies liefe nicht nur entgegen der erwartungshaltung eines mit der  
sprachspezifikation vertrauten anwenders, sondern verbaute auch  
den gewuenschten effekt, dass funktional angewandte konstruktoren  
der typwandlung dienten.  
und es gibt durchaus objekte, die bei berechnungen oder vergleichen  
implizit auf eigene bzw. von `[[Object]]`{:.language-javascript} bzw. anderweitig vererbte  
`[valueOf]`{:.language-javascript} bzw. `[toString]`{:.language-javascript} methoden zugreifen.  
eine in jeglicher hinsicht aesthetisch implementierte konstruktor-  
funktion traegt diesem umstand dort, wo es notwendig erscheint  
rechnung, indem sie einen geeigneten primitiven wert zurueckgibt.  
  
links ...  
- theoretisch unterstuetzend  : [»Funktion nicht als Konstruktor«](http://groups.google.com/group/de.comp.lang.javascript/browse_frm/thread/445e720541c03165/35818a7259c326e4?lnk=st&q=#35818a7259c326e4)  
- durch die praxis untermauert: [»*Echte*Number-Instanzen können doch mit eigenen Methoden rechnen«](http://forum.de.selfhtml.org/archiv/2008/5/t171732/#m1125422)  
  
  
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](http://javascript.crockford.com/)  
  
[ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:\]](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%28+fl%3A%29+br%3A%3E+va%3A%28+ls%3A%26+fo%3A%29+rl%3A%29+n3%3B%7D+n4%3A%7D+ss%3A%7D+de%3A%B5+js%3A%7D+mo%3A%3F+zu%3A%5D)