Don P: new Object(x) statt object(x)

Beitrag lesen

Hallo,

eine  Frage noch, wenn Crockford sagt, JS hätte die Prototypische Vererbung vermurkst um wie eine Klassenbasierte auszusehen.

Leider ist mir auch mir keine andere prototypische Sprache bekannt, aber Crockfords Ausführungen nach ist es klar so, dass JavaScript tatsächlich ein "prototypal system" ist [1].

"Vermurkst" ist es lediglich in dem Sinne, dass man es seiner Meinung nach versäumt hat, einen Operator einzuführen, der ein Objekt direkt von einem anderen erben lässt: "In a prototypal system, objects inherit from objects."

Er beklagt, dass die Vererbung mit dem new-Operator nur indirekt über den Prototyp eines anderen Objekts geschieht: "it [javascript] has a new operator, such that new f() produces a new object that inherits from f.prototype"

Es wäre ihm aber lieber gewesen und entspräche dann seiner Vorstellung einer echten prototypischen Spache, wenn der Operator, nennen wir ihn mal "neuu" (n-e-dabbeljuu), mit neuu f() ein Objekt lieferte, das direkt von f erbt, anstatt von f.prototype.

Der Unterschied ist der, dass man z.B. mit neuu {prop: val} ein leeres Objekt erhalten könnte, das {prop: val} zum Prototyp hat (man könnte über prop auf val zugreifen), während new {prop: val} ein leeres Objekt ergeben würde, das Object zum Prototyp hätte (also ={}), so dass prop und val dann vollends verloren wären, weshalb das auch realiter zum Fehler "is not a constructor" führt. Man ist somit quasi gezwungen, Konstruktoren zu benutzen: "This indirection was intended to make the language seem more familiar to classically trained programmers".

Man denke sich also nur noch einen solchen Operator neuu dazu - und fertig ist das "true prototypal system", das Doug vorschwebt.

Nichts leichter als das, führt er dann weiter aus ("Fortunately, it is easy to create an operator that implements true prototypal inheritance"), und präsentiert seine m.E. geniale object-Funktion:

  
    function object(o) {  
        function F() {}  
        F.prototype = o;  
        return new F();  
    }

Natürlich ist es eine Funktion, kein Operator. Aber sie leistet genau das, was er verlangt: Das erzeugte Objekt hat im Prototyp die Eigenschaften und Methoden des Ausgangsobjekts, nicht lediglich die des Prototyps vom Ausgangsobjekt. Ansonsten hat es erst mal keine eigenen Eigenschaften und Methoden. Letzteres mag auf den ersten Blick verwirren, stellt sich aber als äußerst nützlich heraus, wenn man ein Weilchen damit experimentiert...

[1] "JavaScript's constructor pattern [...] obscured JavaScript's true prototypal nature." (to obscure = verschleiern, verbergen) - ohne Gewähr ;)

Gruß, Don P

0 67

Vererbungshierarchie ?!?

Kurt Z
  • javascript
  1. 0
    Struppi
    1. 0
      molily
    2. 0
      Don P
      1. 0
        Kurt Z
        1. 0
          Struppi
          1. 0
            Don P
            1. 0
              Struppi
              1. 0
                Don P
                1. 0
                  Struppi
                  1. 0
                    Don P
                    1. 0
                      Struppi
                      1. 0
                        Don P
                        1. 0
                          Struppi
                          1. 0
                            Don P
                      2. 0
                        Kurt Z
                        1. 0
                          Struppi
                          1. 0
                            Kurt Z
                            1. 0
                              Struppi
                              1. 0
                                Kurt Z
                                1. 0
                                  Struppi
                                  1. 0
                                    Kurt Z
                                    1. 0
                                      LanX²
                                    2. 0
                                      Struppi
                                      1. 0
                                        Kurt Z
                                        1. 0
                                          Kurt Z
                                        2. 0
                                          Struppi
                                          1. 0
                                            Kurt Z
                              2. 0
                                Don P
              2. 0
                LanX²
                1. 0

                  Function.prototype.begetObject

                  LanX²
                  1. 0
                    Don P
                    1. 0

                      Knobelaufgabe

                      LanX²
                      1. 0
                        Don P
                    2. 0
                      molily
                      1. 0
                        Kurt Z
                        1. 0

                          Please beget it!

                          LanX²
                          1. 0
                            Kurt Z
                          2. 0
                            Don P
                            1. 0
                              LanX²
                              1. 0
                                Don P
                              2. 0

                                Iterator

                                KurtZ
                                1. 0
                                  LanX
                      2. 0
                        Don P
        2. 0

          new Object(x) statt object(x)

          Kurt Z
          1. 0
            Murphy
            1. 0
              Kurt Z
              1. 0
                Don P
              2. 0
                Murphy
                1. 0
                  Kurt Z
                2. 0
                  molily
  2. 0
    LanX²
  3. 0
    molily
  4. 3

    __proto__ chain

    LanX²
    1. 0
      LanX²
      1. 0
        Kurt Z
    2. 1
      molily
  5. 0

    JS-Version?

    Kurt Z
    1. 0
      Kurt Z
      1. 0
        molily
        1. 0
          molily
    2. 0
      molily
      1. 0
        Kurt Z
        1. 0
          molily
          1. 0
            Kurt Z
  6. 0

    VIELEN DANK!!!

    Kurt Z
    1. 0
      Struppi