peterS.: object-hierarchie / prototypen-konzept

Beitrag lesen

hallo Antje,

:-) wem sagst du das. Ich kämpfe mich gerade durch dieses Dokument um die Objektorientiertheit von JavaScript exakt zu erfassen und mit einfachen Worten zu beschreiben und insbesondere eine gescheite Hierarchie abzubilden.

meine bisherigen erfahrungen wuerde ich so zusammenfassen:

  • in Javascript ist alles "Object" (, da sich alles   auf  "das globale Objekt"  herunterbrechen laesst);

  • objekte wiederum sind traeger von   datentypen  -  der datentyp eines   objekts laesst sich mit dem operator   "typeof" ermitteln und kann zur zeit   folgendermassen lauten:

- "object"

- fuer "Object" -konstruktor: new Object();                         -funktion   : Object();                         -literal    : {property1:value1,property2:value2,..,propertyN:valueN};         - fuer "Array" -konstruktor: new Array(value1,value2,..,valueN);                         -literal    : [value1,value2,..,valueN];   (MSIE)- fuer "RegExp" -konstruktor: new RegExp("[rule]","[flag]");                         -literal    : /[rule]/[flag];         - fuer "Date" -konstruktor: new Date();                         -funktion   : Date();         bsp.:

alert("bsp.\t: new Object()\n\ntype\t: "" + typeof(new Object()) + ""\n\n\nconstructor:\n" + new Object().constructor.toString());         alert("bsp.\t: [1,2,3]\n\ntype\t: "" + (typeof [1,2,3]) + ""\n\n\nconstructor:\n" + [1,2,3].constructor.toString());         alert("bsp.\t: /\s/\n\ntype\t: "" + typeof(/\s/) + ""\n\n\nconstructor:\n" + /\s/.constructor.toString());         alert("bsp.\t: new Date()\n\ntype\t: "" + typeof(new Date()) + ""\n\n\nconstructor:\n" + new Date().constructor.toString());

- "function"

- fuer "Function"-konstruktor: xyz = new Function("[argument1]","[argument2]",..,"[argumentN]","[body]");                          -literal    : xyz = function("[argument1]","[argument2]",..,"[argumentN]","[body]");                          -definition : function xyz("[argument1]","[argument2]",..,"[argumentN]","[body]"); [

(gecko)- fuer "RegExp" -konstruktor: new RegExp("[rule]","[flag]");                         -literal    : /[rule]/[flag];

// was ich nicht fuer eine so gute idee halte; ]

bsp.:

alert("bsp.\t: new Function("",";")\n\ntype\t: "" + typeof(new Function("",";")) + ""\n\n\nconstructor:\n" + new Function("",";").constructor.toString());         alert("bsp.\t: /\s/\n\ntype\t: "" + typeof(/\s/) + ""\n\n\nconstructor:\n" + /\s/.constructor.toString());

- hierzu sei angemerkt, dass sich im javascript-host ("window"-object           in js-faehigen browsern) referenzen auf funktionen nur dann zurueck-           verfolgen lassen(der funktionsname laesst sich ermitteln, und ueber           "window[funktionsname]" ist die existenz der funktion nachpruefbar),           wenn diese ueber die herkoemmliche definition mit dem schluesselwort           "function" eingefuehrt wurden - in selbstdefinierten objekten deren           methoden auf globale funktionen verweisen ergaebe eine pruefung auf           den funktionsnamen sowohl fuer die konstrukor- als auch die literal-           schreibweise: "function anonymus() { [functionCode]; }";

- "string"

- fuer "String" -konstruktor: new String();                         -funktion   : String();                         -literal    : "1";         bsp.:

alert("bsp.\t: "1"\n\ntype\t: "" + (typeof "1") + ""\n\n\nconstructor:\n" + "1".constructor.toString());

- "number"

- fuer "Number" -konstruktor: new Number();                         -funktion   : Number();                         -literal    : 1;

bsp.:

alert("bsp.\t: 1\n\ntype\t: "" + typeof(1) + ""\n\n\nconstructor:\n" + (1).constructor.toString());

- "boolean"

- fuer "String" -konstruktor: new Boolean();                         -funktion   : Boolean();                         -literal    : true;         bsp.:

alert("bsp.\t: true\n\ntype\t: "" + (typeof true) + ""\n\n\nconstructor:\n" + true.constructor.toString());

- "undefined"

  • daraus und nach meinem bisherigen verstaendnis der   sprache ergibt sich  fuer mich folgende hierarchie:

Object                    (global)                        |                +-------+-------+                |               |            (complex)      (primitive)                |               |    +-----+-----+-----+         |    |     |           |         |   Math   +-Array  Function     +-Number    |     +-RegExp    |         +-String    |     +-Date      |         +-Boolean    |     +-Error     |         |    |     |           |         |    |     |        -kann neue   |    |     |         konstruk-   |    |     |         toren de-   |    |     |         finieren    |    |     |           |         |    |     |           |         |   -kein  +-auf diese objekte   +-diese objekte    new-    kann nur referen-     werden bei einer    ope-    ziert werden;         zuweisung kopiert;    rator;            |                   |    |                 |                   |    |                 +---------+---------+   -kein                        |    proto-                      |    typing;          prototyping ist moeglich;

ich habe in den letzten wochen tief in js-code rumgewuehlt, um das prototypenkonzept von js hinsichtlich eines besseren objektorientierten programmierstils in dieser sprache auszuloten  -  als onlinedokumuffel und nur-besitzer-von-"JavaScript 1.2 von David Flanagan/O'REILLY" kam ich trotzdem zur erkenntnis,  dass mein 2 jahre alter feature artikel http://aktuell.de.selfhtml.org/artikel/javascript/table-obj/index.htm gelinde gesagt halbverdauter quark ist (ein typischer schnellschuss eben), und etwas getan werden muss;

die ersten ergebnisse meines tuns, die auch Dich interessieren koennten, habe ich unter

http://www.pseliger.de/jsExtendedApi/_reference_jsApi_cloneAndScanObjects.html bzw. http://www.pseliger.de/jsExtendedApi/__tableConstructor.prev.030430.html

abgelegt  -  wobei der quellcode des zuletzt aufgefuehrten dokuments die umsetzung meines gesamten in den letzten 4 wochen zusammengetragenen wissens zu den hier angesprochenen fragen darstellt (oo, performance) und die grundlage zu einem ueberarbeiteten feature-artikel sein soll;

by(t)e by(t)e - peterS. - pseliger@gmx.net

-- sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)