Dependency Injection, Aggregation und Delegation mit Javascript

Finessen in der Objektorientierten Programmierung mit JavaScript

Betrachte untenstehenden Code:

let date = new Date( Date.now() ); // Legacy
let datetime = new DateTime(date); // Custom

Da wird also ein Legacy-Date-Objekt erstellt und zum Erstellen einer Instanz der eigenen Klasse DateTime übergeben. Ein solche Vorgehensweise wird Dependency Injection genannt. Ziel ist es, Objekte anderer Klassen in Methoden der eigenen Klasse zu verwenden. Aufgrunddessen ist es auch möglich, diese Fremdobjekte erst in der eigenen Klasse zu erstellen anstatt sie vor der Instanzerstellung zu erzeugen. Übergeben wird dann lediglich das was die Objekte der Fremden Klasse(n) benötigen. Und das sieht so aus:

// Erzeuge nur die Instanz der eigenen Klasse
let dati = new DateTime( Date.now() );

Beispiel einer JavaScript Klasse

Es ergibt sich eine einfache Anwendung, Synopsis:

let dati = new DateTime();
dati.localtime().str;
// 
dati.gmtime().dmy; 
// 
dati.gmtime().hms;
// 
dati.gmtime().year;
// 
dati.gmtime().str;
// 
// Perl.gmtime: Sat Oct  5 15:46:39 2024

Die Methoden localtime und gmtime werden also ganz ähnlich der gleichnamigen Perlfunktionen angewandt und das war auch das Ziel dieser Entwicklung.

Gleichnamige eigene Methoden

Mit dem aggregierten Objelt, so bezeichnet man Objekte die in eigenen Instanzen Eigenschaften sind, ist es ganz einfach, Methoden zu definieren die genauso heißen wie die Methoden der fremden Klasse. Beispiel:

DateTime.prototype.toString 
  = function(){ return this.Date.toString(); };
DateTime.prototype.toUTCString 
  = function(){ return this.Date.toUTCString(); };

Class DateTime

// Date Time Class customized, optimized
// ClassName: DateTime

// timestamp ist IMMER UTC in Milli(!)Sekunden seit 1.1.1970
function DateTime( timestamp ){
    this.utc = timestamp != null ? timestamp : Date.now();
    // Legacy Date-Objekt    
    this.Date = new Date( this.utc );
}

// localtime() und gmtime() analog der gleichnamigen
// Perlfunktionen
DateTime.prototype.localtime = function(){
    let hunt = {
        year: this.Date.getFullYear(),
        mon:  this.Date.getMonth() + 1,
        mday: this.Date.getDate(),
        min:  this.Date.getMinutes(),
        hour: this.Date.getHours(),
        sec:  this.Date.getSeconds(),
        str:  this.Date.toString(),
    };
    let d2 = hunt.mday.toString().length == 2 ? hunt.mday : "0"+hunt.mday;
    let m2 = hunt.mon.toString().length == 2 ? hunt.mon : "0"+hunt.mon;
    hunt.dmy = d2+"."+m2+"."+hunt.year;
    let hh = hunt.hour.toString().length == 2 ? hunt.hour : "0"+hunt.hour;
    let mm = hunt.min.toString().length == 2 ? hunt.min : "0"+hunt.min;
    let ss = hunt.sec.toString().length == 2 ? hunt.sec : "0"+hunt.sec;
    hunt.hms = hh+":"+mm+":"+ss;
    return hunt;
};

DateTime.prototype.gmtime = function(){
    let hunt = {
        year: this.Date.getUTCFullYear(),
        mon:  this.Date.getUTCMonth() + 1,
        mday: this.Date.getUTCDate(),
        min:  this.Date.getUTCMinutes(),
        hour: this.Date.getUTCHours(),
        sec:  this.Date.getUTCSeconds(),
        str:  this.Date.toUTCString(),
    };
    let d2 = hunt.mday.toString().length == 2 ? hunt.mday : "0"+hunt.mday;
    let m2 = hunt.mon.toString().length == 2 ? hunt.mon : "0"+hunt.mon;
    hunt.dmy = d2+"."+m2+"."+hunt.year;
    let hh = hunt.hour.toString().length == 2 ? hunt.hour : "0"+hunt.hour;
    let mm = hunt.min.toString().length == 2 ? hunt.min : "0"+hunt.min;
    let ss = hunt.sec.toString().length == 2 ? hunt.sec : "0"+hunt.sec;
    hunt.hms = hh+":"+mm+":"+ss;
    return hunt;
};

Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de.