gpt4 book ai didi

javascript - JS TS 对所有方法应用装饰器/枚举类方法

转载 作者:搜寻专家 更新时间:2023-10-30 21:03:34 25 4
gpt4 key购买 nike

我想对一个类中的所有方法应用一个装饰器函数,这样我就可以替换:

class User {
@log
delete() {}

@log
create() {}

@log
update() {}
}

@log
class User {
delete() {}
create() {}
update() {}
}

最佳答案

创建类装饰器并枚举目标原型(prototype)上的属性。

对于每个属性:

  1. 获取属性描述符。
  2. 确保它用于方法。
  3. 将描述符值包装在记录有关方法调用信息的新函数中。
  4. 将修改后的属性描述符重新定义回属性。

修改属性描述符很重要,因为您要确保您的装饰器能够与修改属性描述符的其他装饰器一起工作。

function log(target: Function) {
for (const propertyName of Object.keys(target.prototype)) {
const descriptor = Object.getOwnPropertyDescriptor(target.prototype, propertyName);
const isMethod = descriptor.value instanceof Function;
if (!isMethod)
continue;

const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log("The method args are: " + JSON.stringify(args));
const result = originalMethod.apply(this, args);
console.log("The return value is: " + result);
return result;
};

Object.defineProperty(target.prototype, propertyName, descriptor);
}
}

基类方法

如果您希望这也影响基类方法,那么您可能需要以下几行:

function log(target: Function) {
for (const propertyName in target.prototype) {
const propertyValue = target.prototype[propertyName];
const isMethod = propertyValue instanceof Function;
if (!isMethod)
continue;

const descriptor = getMethodDescriptor(propertyName);
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log("The method args are: " + JSON.stringify(args));
const result = originalMethod.apply(this, args);
console.log("The return value is: " + result);
return result;
};

Object.defineProperty(target.prototype, propertyName, descriptor);
}

function getMethodDescriptor(propertyName: string): TypedPropertyDescriptor<any> {
if (target.prototype.hasOwnProperty(propertyName))
return Object.getOwnPropertyDescriptor(target.prototype, propertyName);

// create a new property descriptor for the base class' method
return {
configurable: true,
enumerable: true,
writable: true,
value: target.prototype[propertyName]
};
}
}

关于javascript - JS TS 对所有方法应用装饰器/枚举类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47621364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com