javascript - Klasse-dekoratør i Typescript
Jeg prøver å forstå hvordan klassedekoratorer fungerer i Typescript når vi ønsker å erstatte konstruktøren. Jeg har sett dette eksemplet:
const log = <T>(originalConstructor: new(...args: any[]) => T) => {
function newConstructor(... args) {
console.log("Arguments: ", args.join(", "));
new originalConstructor(args);
}
newConstructor.prototype = originalConstructor.prototype;
return newConstructor;
}
@log
class Pet {
constructor(name: string, age: number) {}
}
new Pet("Azor", 12);
//Arguments: Azor, 12
Alt er forstått bortsett fra denne linjen:
newConstructor.prototype = originalConstructor.prototype;
Hvorfor gjør vi det?
Svar #1
Klasser som:
class Pet {
constructor(name: string, age: number) {}
dosomething() {
console.log("Something...");
}
}
Kompileres til funksjoner når man retter seg mot ES5:
var Pet = (function () {
function Pet(name, age) {
}
Pet.prototype.dosomething = function () {
console.log("Something...");
};
return Pet;
}());
Som du kan se når vi bruker funksjoner for å definere klasser. Metodene legges til funksjonens prototype.
Dette betyr at hvis du skal lage en ny konstruktør (ny funksjon), må du kopiere alle metodene (prototypen) fra det gamle objektet:
function logClass(target: any) {
// save a reference to the original constructor
const original = target;
// a utility function to generate instances of a class
function construct(constructor: any, args: any[]) {
const c: any = function () {
return constructor.apply(this, args);
};
c.prototype = constructor.prototype;
return new c();
}
// the new constructor behaviour
const newConstructor: any = function (...args: any[]) {
console.log("New: " + original.name);
return construct(original, args);
};
// copy prototype so intanceof operator still works
newConstructor.prototype = original.prototype;
// return new constructor (will override original)
return newConstructor;
}
Du kan lære mer på "Dekoratorer & metadatarefleksjon i TypeScript: Fra nybegynner til ekspert (Del I)"
Oppdater
Vennligst se https://github.com/remojansen/LearningTypeScript/tree/master/chapters/chapter_08 for en nyere versjon.
