Rolf B: Function Borrowing mit Konstruktor-Funktion?

Beitrag lesen

Hallo MB,

sicher, dass Du das wolltest?

Mit bind erzeugst Du eine neue Funktion, die getFormalName an mm bindet. D.h. du schaffst damit eine Assoziation zwischen einer Funktion und einem Objekt. Und diese neue Funktion musst Du speichern, sonst ist sie gleich wieder weg.

Es ist nicht so sinnvoll, getFormalName.bind(mm)() zu schreiben. Das erzeugt den Overhead des Bindings und schmeißt das Gebinde gleich wieder weg. Für eine Einmalaktion ist getFormalName.apply(mm) viel sinnvoller.

bind lohnt sich nur, wenn Du das Gebinde behalten willst. Aber - wie gesagt - dann muss es gespeichert werden.

let mmFormalName = getFormalName.bind(mm);
console.log(mmFormalName());   // -> Mustermann, Max

Das sieht dann allerdings auch nicht mehr objektorientiert aus. Für eine objektorientierte Schreibweise, wenn also mm.getFormalName() funktionieren soll (ohne User.prototype anzugreifen), müsstest Du dies tun:

mm.getFormalName = getFormalName;
mm.getFormalName();            // -> Mustermann, Max

Damit erzeugst Du am mm Objekt - also einer Instanz eines User-Objekts, eine Eigenschaft getFormalName, in der ein Verweis auf die getFormalName-Funktion gespeichert ist.

Wenn Du die getFormalName Funktion als Methode für alle User-Objekte bereitstellen willst, musst Du sie an User.prototype.getFormalName zuweisen - aber das wolltest Du ja offenbar nicht

Fazit:

Es gibt 4 Stufen, wie Du getFormalName mit User verbinden kannst.

  • Nur für einen Call: getFormalName.apply (oder getFormalName.call)
  • Permanent für eine Instanz des Objekts, als Funktion: mit .bind
  • Permanent für eine Instanz, am Objekt gespeichert: Als Eigenschaft am Objekt
  • Permanent für alle Instanzen von User: Als Eigenschaft an User.prototype.

Rolf

--
sumpsi - posui - obstruxi