peterS.: Klassen auf einem Poster?

Beitrag lesen

gruss Frank,

gibt es irgendwo eine Übersicht für die JavaScript Klassen auf einem Poster?

das weiss ich nicht;

... Übersicht für die JavaScript Klassen ...

------------------------------------^^^^^^^

...Hierarchie, wer stammt von wem ab usw.

ein klassenkonzept ist in javascript bis zur version 1.5 unbekannt;

der sprachumfang "kennt" in dem von Dir gewuenschten sinne nur
objekte/konstruktoren sowie das prototypen-konzept;

native js-objekte sind:

  • das "Object"-objekt, auf das jedes andere js-objekte zurueckgefuehrt
      werden kann und von dem alle js-objekte prototypisch "erben"  (dazu
      spaeter mehr),
  • das "Array"-objekt, welches man durchaus als ein speziell fuer diesen
      zweck aufgebohrtes "Object"-objekt bezeichnen kann;

beide gerade genannten objekte identifizieren sich ueber den operator
  "typeof" (bsp.: typeof(new Object()), typeof(new Array())) auch als
  "object";

die enge beziehung zwischen "Array" und "Object" manifestiert sich im
  dualismus objekt - assoziatives array:

* ein objekt (konstruktor: "Object") ist immer auch ein assoziatives
    array;
  * rein assoziative arrays sind immer auch objekte im sinne von "Object";

objekte, deren konstruktoren "Array" oder "Object" bzw. die vom typ
  "object" sind, werden bei variablen-zuweisungen immer nur referenziert;

sowie:

  • das "Function"-objekt, welches ebenfalls eine sonderrolle einnimmt,
      da funktionen, die intern mit einer eigen-referenzierung ueber das
      schluesselwort "this" arbeiten konstruktoren fuer selbstdefinierte
      objekte sind, sobald diese funktionen mit dem operator "new" aufge-
      rufen werden;

weiterhin:

  • die objekte "Boolean", "Number", "String"

bzw.:

  • die objekte "RegExp", "Date" und "Error";

prototypische vererbung findet in javascript ueber das object "prototype"
statt, welches eine eigenschaft eines jeden js-objektes ist, da schon das
oberste js-objekt "Object" diese eigenschaft implementiert;

um z.b.: die alle js-objekte erfassenden methoden "getConstructorName()"
bzw. "getObjectType()" zu realisieren, wird das prototype-objekt von
"Object" um die entsprechenden eigenschaften erweitert, die als funktionen
umgesetzt und zugewiesen werden;

Object.prototype.getConstructorName = function() {
  var thisConstructor = this.constructor;
  var thisConstructorString = thisConstructor.toString();
  var regExpDefault = /^\s*function\s+([a-zA-Z0-9_(]{2,}[^)]))/;
  var regExpMsie5x= /^\s*[object\s+([a-zA-Z0-9_]{1,})/;
  return ((thisConstructor) ? ((regExpDefault.test(thisConstructorString)) ? (regExpDefault.exec(thisConstructorString)[1]+")") : ((regExpMsie5x.test(thisConstructorString)) ? (regExpMsie5x.exec(thisConstructorString)[1]+"()") : (null))) : (null));
};

Object.prototype.getObjectType = function() {
  var thisConstructor = this.constructor;
  var thisConstructorString = thisConstructor.toString();
  var regExpDefault = /^\s*function\s+([a-zA-Z0-9_]{1,})/;
  var regExpMsie5x = /^\s*[object\s+([a-zA-Z0-9_]{1,})/;
  return((thisConstructor) ? ((regExpDefault.test(thisConstructorString)) ? (regExpDefault.exec(thisConstructorString)[1].toLowerCase()) : ((regExpMsie5x.test(thisConstructorString)) ? (regExpMsie5x.exec(thisConstructorString)[1].toLowerCase()) : ("object"))) : ("object"));
};

die zwei methoden sind nun an jedes mit den oben besprochenen konstruktoren
erzeugte objekt (auch an die selbstdefinierten) ueber die prototypen-kette
gebunden;
obwohl man nun ohne weiteres "alert((new Date()).getObjectType());" schreiben
kann, "besitzt" die prototype-eigenschaft eines "Date"-objekts diese methode
nicht direkt - der zugriff wuerde hier automatsich ueber folgende stationen
laufen:

  • [date-object].getObjectType ? false

  • [date-object].constructor ?= function Date() { ... }

  • function Date() { ... }.getObjectType ? false

  • function Date() { ... }.prototype.getObjectType ? false

  • function Date() { ... }.constructor ?= function Function() { ... } oder auch

  • function Date() { ... }.constructor ?= function Object() { ... }, denn
      so genau weiss ich das jetzt nicht;

auf alle faelle landet js irgendwann bei "Object":

  • function Object() { ... }.getObjectType ? false
  • function Object() { ... }.prototype.getObjectType ? true

das beispielhaft gewaehlte date-objekt "borgt" sich zum zeitpunkt des
methoden-aufrufs demzufolge nur den funktions-datentyp vom obersten
objekt "Object" und wendet diesen auf sich selber an;

+------Functiom
    |
    |

  • Object---Array
        |
        |
        |
        +------Boolean
        |
        +------Number
        |
        +------String
        |
        |
        |
        +------RegExp
        |
        +------Date
        |
        +------Error

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

ps - gerade gesagtes entspricht meinem derzeitigen wissensstand in javascript,
     was missverstaendliche ausdrucksweise meinerseits bzw.irrtuermer, denen
     ich durch mangelndes verstaendnis aufgesessen bin, nicht ausschliesst -
     korrekturen und gutgemeinte ratschlaege werden deshalb dankbar angenommen;

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