Obiekty w Javascript są... dziwne...

0

Hei,
Ostatnio wróciłem do zakurzonego projektu w Javascript. Między innymi chciałem się pozbyć pewnego mankamentu. W samym systemie chodzi o tworzenie obiektów dziedziczących prototypowo z pewnego, dostępnego szablonu. Rzecz w tym, że sam szablon powinien wykonywać kilka zadań zaraz po utworzeniu instancji obiektu.

var Foo = (function(){
   /*konstruktor klasy*/
   super.instantiate();  //Mankament
})
Foo.prototype = new Parent();

Żeby się tego pozbyć musiałem się trochę namęczyć, ale finalnie zrobiłem coś takiego (raczej z ciekawości, czy zadziała):

var Parent = (function(child){
   /*konstuktor klasy rodzica*/

  child.prototype = this;
  return (function(){
    var obj = new (child.apply( obj, arguments ));
    obj.prototype.instantiate();
    return obj;
  });
})

Używane jako:

var Foo = (function(){
   /*konstruktor klasy*/
})
Foo = new Parent( Foo ); //Tutaj przydałby się jakiś synonim jak: "Foo = new ChildOfParent( Foo );"

Sporo rzeczy pominąłem. Chciałem przedstawić tylko ogólny zamysł i podzielić się moim zaskoczeniem nad faktem, że coś takiego działa.

P.S.: Nie mogłem znaleźć w ECMA 5.1 ani słowa na temat wartości zwracanej przez konstruktor zdefiniowanych typów, więc nie jestem pewien, czy to nie jest zachowanie niestandardowe (Firefox 36.0.4).

0

Jak dziedziczenie prototypowe Cię przerasta (bez urazy) to znacznie łatwiej będzie Ci użyć ES6 i jakiegoś transpilera do ES5. Od siebie polecę BabelJS (dawne 6to5). Działa sprawnie, bez dodatkowego runtime i kod wyjściowy jest całkiem przejrzysty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0