Parameter und Argumente an jede Funktion anhängen

Hallo,

Ich stelle mir seit längerem die Frage, ob es vielleicht möglich ist das „Function“ Modell zu manipulieren. Ich würde nämlich gerne jede bereits Erstellte und zukünftig Instanz einer Funktion (egal ob anonym oder nicht) manipulieren durch das anhängen von einem weiteren Parameter und an den einen Standardwert setzen.

Beispiel:
//Jede Funktion hat einen weiteren parameter „b“ mit dem Standartwert „parameterB“

function f (a) {
alert(arguments);
}

f(‚parameterA‘);

//Resultat: [‚parameterA‘, ‚parameterB‘]

Zudem stelle ich mir die frage, ob man den jeden Funktionsaufruf loggen kann.

Für den Standardparameter stellt sich mir die Frage, wozu das gut sein soll. Ich denke, du könntest deine Wünsche zumindest simulieren.
[HTML]
function f (a,b) {
if (b==null) b=‚parameterB‘;
if (debug) console.log(arguments);
alert(arguments);
}
f(‚parameterA‘); //gewünschtes Ergebnis[/HTML]

Ich würde gerne bei allen Funktionen dies machen, da ich ein externes Script implementiere, wobei alle Werte simuliert werden müssen, damit ich Einfluss auf dieses habe. Eine Einfache Anpassung geht nicht, da der Content dynamisch ist (zudem sind die meisten Funktionen sowieso anonym und werden erst nach einer gewissen Zeit erstellt). Ist das Function(.prototype) Object der Ansatz?

Bin nicht so fit in JavaScript, aber ich kann mir nur vorstellen, dass du dann den Prototype sozusagen als Objekt definierst mit einer zusätzlichen Property defaultParameterValue und einer eigenen Methoden logFunctionCall und showArguments und in dieser zweiten Methode entweder die arguments ausgibst oder, wenn das nicht genügend sind (wie entscheiden???) noch zusätzlich die Property defaultParameterValue.

Nicht Funktionen, sondern Objekte lassen sich instanziieren. Da JS bis einschließlich ES5 keine Class Syntax besitzt, verwendet es prototyping zum vererben von Methoden und das Keyword new zum erzeugen von Instanzen.

Du solltest dir vorab überlegen, was du erreichen willst und danach die Tools suchen. Oft bieten Frameworks schon Funktionalitäten an, die man sonst erst erstellen müsste. Soll es tatsächlich Vanilla JS sein, findest du auf MDN Beispiele für JavaScript OOP. Ergänzend dazu könntest du dir ES6 anschauen - dort gibt es jetzt zumindest ein Keyword class und eventuell noch TypeScript.

Interessant deine Hinweise zu ES5 und ES6. Beim Nachlesen bin ich noch auf die folgende Seite gestoßen, die aufführt, welcher Browser welche Version in welchem Umfang unterstütz http://kangax.github.io/compat-table/es6/ .

Eine gute Idee, jedoch müsste ich dazu wissen, wie ich an die prototype eine Execution anhängen kann.

//zum Beispiel:
Function.prototype._alert = alert;
Function.prototype._alert('Eine neue Funktion wurde erstellt.'); //<- Geht leider nicht :(

//zum Beispiel 2:
Function.prototype._alert = (function () { alert('Eine neue Funktion wurde erstellt.') })();  //<- wird zu früh ausgeführt

Update #Soinetwa sollte dies aussehen:

var a = function () {};
a.__defineGetter__('animation', function () { alert() });

var b = function () { this.animation };
b.prototype = a;

new b();

Damit könnte ich vielleicht das Function Object verändern. Jedoch lässt es sich doch nciht so einfach gestalten, wie das obere Beispiel

@NetAktiv
Ich bin hauptsächlich wegen Usern wie dir noch in diesem Forum vertreten. Leuten, die zwar nicht viel Ahnung von der Materie haben, aber zumindest Engagement zeigen. Weil ich mich in der Retrospektive wiedererkenne und jederzeit dankbar für Hinweise auf best practice und aktuelle(re) Technologien (gewesen) bin. Allerdings gehst du mir mit deiner als Interesse verbrämten Besserwisserei mittlerweile ziemlich auf den Senkel.

Mir ist die Browserkompatibilät von ES6 durchaus bekannt, aber erstens ist das in absehbarer Zeit egal; zweitens bin ich der Meinung, dass sich ein Einsteiger lieber mit modernem JavaScript beschäftigen sollte, anstatt uralten Kram auszugraben und anschließend ein so-macht-man-das-nicht-mehr an den Kopf geworfen zu bekommen; drittens hatte ich mit MDN OOP und Typescript Begriffe erwähnt, die mit der aktuellen Generation in Einklang zu bringen sind; und viertens spielen Technikverweigerer mit veralteten Browsern in meinen Erwägungen ebenso wenig eine Rolle, wie Lernverweigerer, die an ihrem Kenntnisstand aus der vergangenen Dekade festhalten. Nachdem MS den Support für XP und Win7 gedropt hat, bildet der IE10 den kleinsten gemeinsamen Nenner.

Fünftens bitte ich dich darum, nur dann zu antworten, wenn du Konstruktives beizutragen hast, was mir eventuell neue Perspektiven vermitteln könnte und auch deine sonstigen Ratschläge im Forum daraufhin zu überprüfen, ob diese noch dem aktuellen Stand der Webentwicklung entsprechen.

Danke fürs Zuhören.

Du müsstest call, bzw apply überschrieben, aber beachte auch die Probleme die dadurch auftreten können. (Infinity loops beim logging), das anhängen des Parameter sollte gut möglich sein. Zu beachten ist aber der unterschied der Parameterübergabe bei apply und call.

Siehe: http://stackoverflow.com/questions/5226550/can-i-override-the-javascript-function-object-to-log-all-function-calls und
http://odetocode.com/blogs/scott/archive/2007/07/04/function-apply-and-function-call-in-javascript.aspx

Guter Ansatz, jedoch verhalten sich diese beiden Funktionen „apply“ und „call“ sehr komisch (ob das am InfinityLoop liegt oder an dem mit was man es überschreibt?). Manchmal gehen diese nach dem überschreiben gar nicht oder verzögert.

Habe das ganze in den neusten Versionen Chromes und Firefox’ getestet.

Ich habe dies nun nochmals recherchiert und dabei herausgefunden, das dies in modernen Browsern unterbunden wird; es besteht somit nicht die Möglichkeit dies per Function.prototype.call und Function.prototype.apply zumachen. Mmmh kennt jemand noch einen anderen Lösungsweg?