Heim >Web-Frontend >js-Tutorial >Detaillierte Erläuterung der Funktions-Decorator-Beispiele in JavaScript

Detaillierte Erläuterung der Funktions-Decorator-Beispiele in JavaScript

零下一度
零下一度Original
2017-04-18 11:03:021715Durchsuche

In diesem Artikel wird hauptsächlich die JavaScript-Dekoratorfunktion (Decorator) vorgestellt und die Funktion, Implementierung und Verwendung der JavaScript-Dekoratorfunktion (Decorator) anhand von Beispielen analysiert. Freunde in Not können sich auf diesen Artikel beziehen

Das Beispiel beschreibt die Javascript-Dekoratorfunktion (Decorator). Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Decorator-Funktion (Decorator) wird verwendet, um dem Objekt während der Laufzeit dynamisch bestimmte Funktionen, Verantwortlichkeiten usw. hinzuzufügen. Im Vergleich zur Erweiterung der Funktionen von Objekten durch Vererbung sind Dekoratoren flexibler. Erstens können wir einen Dekorator für das Objekt dynamisch auswählen, anstatt das Objekt hart zu erben, um einen bestimmten Funktionspunkt zu implementieren. Zweitens: Die Vererbungsmethode kann zu einer großen Anzahl von Unterklassen führen, was etwas überflüssig ist, nur um einen einzelnen Funktionspunkt hinzuzufügen.

Einige häufig verwendete Beispiele für Dekoratorfunktionen finden Sie unten. Bitte überprüfen Sie Github auf entsprechende Codes.

1 Onload-Listening-Funktion dynamisch hinzufügen


function addLoadEvent(fn) {
  var oldEvent = window.onload;
  if(typeof window.onload != 'function') {
    window.onload = fn;
  }else {
    window.onload = function() {
      oldEvent();
      fn();
    };
  }
}
function fn1() {
  console.log('onloadFunc 1');
}
function fn2() {
  console.log('onloadFunc 2');
}
function fn3() {
  console.log('onloadFunc 3');
}
addLoadEvent(fn1);
addLoadEvent(fn2);
addLoadEvent(fn3);

2 Funktion vor und nach der Ausführung


Function.prototype.before = function(beforfunc) {
  var self = this;
  var outerArgs = Array.prototype.slice.call(arguments, 1);
  return function() {
    var innerArgs = Array.prototype.slice.call(arguments);
    beforfunc.apply(this, innerArgs);
    self.apply(this, outerArgs);
  };
};
Function.prototype.after = function(afterfunc) {
  var self = this;
  var outerArgs = Array.prototype.slice.call(arguments, 1);
  return function() {
    var innerArgs = Array.prototype.slice.call(arguments);
    self.apply(this, outerArgs);
    afterfunc.apply(this, innerArgs);
  };
};
var func = function(name){
  console.log('I am ' + name);
};
var beforefunc = function(age){
  console.log('I am ' + age + ' years old');
};
var afterfunc = function(gender){
  console.log('I am a ' + gender);
};
var beforeFunc = func.before(beforefunc, 'Andy');
var afterFunc = func.after(afterfunc, 'Andy');
beforeFunc('12');
afterFunc('boy');

Das Ausführungsergebnis wird wie folgt auf der Konsole gedruckt:


I am 12 years old
I am Andy
I am Andy
I am a boy

3 Funktionsausführungszeit Berechnung


function log(func){
  return function(...args){
    const start = Date.now();
    let result = func(...args);
    const used = Date.now() - start;
    console.log(`call ${func.name} (${args}) used ${used} ms.`);
    return result;
  };
}
function calculate(times){
  let sum = 0;
  let i = 1;
  while(i < times){
    sum += i;
    i++;
  }
  return sum;
}
runCalculate = log(calculate);
let result = runCalculate(100000);
console.log(result);

Hinweis: Ich habe hier die Syntax von ES2015 (ES6) verwendet. Wenn Sie interessiert sind, können Sie sich die vorherigen verwandten Inhalte zu ES6 ansehen.

Natürlich sind Dekorationsfunktionen nicht auf diese Verwendungszwecke beschränkt. Das von Tmall verwendete Nodejs-Framework Koa basiert auf Decorator-Funktionen und dem ES2015-Generator. Ich hoffe, dieser Artikel kann Ihnen als Ausgangspunkt für das Schreiben eleganterer JS-Codes dienen.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Funktions-Decorator-Beispiele in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn