javascript - kan jag använda dekoratorer på objektets egenskaper?


Normalt applicerar jag dekoratören på detta sätt:

class SpecialMethods {
    @Deco
    static someMethod() {
    }
}

Finns det också något sätt att använda det med ett vanligt objekt istället för en klass:

const SpecialMethods = {
    @Deco
    someMethod: () => {}
}

Svar #1

Ja, men det är inte särskilt praktiskt. Du kan anropa dekoratorn för egenskaperna hos ett objekt, men inte på samma sätt som du skulle dekorera en klass och dess innehåll.

Givet följande dekoratör:

const TestDecorator = (at: string) => {
    return function (target: any, prop: string, descriptor?: PropertyDescriptor) {
        console.log(`decorated at ${at}}`);
    }
}

Skulle användas på följande sätt i en klass:

class TestClass {
    @TestDecorator('class method')
    public testMethod() { }
}

Men det kan inte tillämpas på samma sätt som ovan för en egendom:

const testObj = {
    @TestDecorator('property method')
    testMethod: () => { }
};

För att arbeta runt detta kan du anropa dekoratorn vid egenskapen.

Först måste du deklarera ditt objekt med alla dess egenskaper:

const testObj = {
    testMethod: () => { }
};

Min dekoratör förväntar sig ett kurrat värde:

const deco = TestDecorator('property method');

Nu måste du manuellt anropa deco-dekoreraren för egenskapen i testObj:

deco(testObj, 'testMethod');

Om du behöver propertyDescriptor i din dekoratör (det finns inte i OP), måste du också tillhandahålla det manuellt:

deco(testObj, 'testMethod', Object.getOwnPropertyDescriptor(testObj, 'testMethod'));

Här är en TS-lekplats. Kontrollera utdata i konsolen.

Relaterade artiklar