gpt4 book ai didi

javascript - 反射似乎正在失去这个

转载 作者:行者123 更新时间:2023-11-29 23:19:35 27 4
gpt4 key购买 nike

我正在尝试为我的类构建一个 AOP 记录器...我遇到一个问题,当我返回到目标函数时,该函数无法访问 this

所以我的 AOP 有点像这样

AOP.js

class AOP {
constructor() {

}
static ClassHandler(obj) {
const InstanceHandler = {
get(target, prop, receiver) {
console.log(target.constructor.name);
const origMethod = target[prop];
return function (...args) {
// let result = Reflect.apply(origMethod, this, args)
let result = Reflect.get(target, prop, receiver)
result = Reflect.apply(result, this, args);
console.log(prop + JSON.stringify(args)
+ ' -> ' + JSON.stringify(result));
return result;
};
},
apply(target, thisArg, argumentsList) {
console.log('actually applied');
}
}

const handler = {
construct(target, args) {
console.log(`${target.name} instantiated`);
console.log(args);
const instance = Reflect.construct(...arguments);
return new Proxy(instance, InstanceHandler);
}
}

return new Proxy(obj, handler);
}
}

module.exports = AOP;

单例

OtherClass.js

class OtherClass {
constructor() {
this._blah = 'this is a shoutout';
}

shoutOut() {
console.log(this._blah);
}
}

module.exports = new OtherClass();

和一个需要单例的类

计算器DI.js

class Calculator {
constructor(otherClass) {
this.otherClass = otherClass;
}

add(a, b) {
this.otherClass.shoutOut();
return a+b;
}

minus(a, b) {
return a-b;
}
}

module.exports = Calculator;

像这样把它们放在一起:

const AOP = require('./src/aspects/AOP');
const Calculator = AOP.ClassHandler(require('./src/CalculatorDI'));
const otherClass = require('./src/OtherClass');
const calculator = new Calculator(otherClass);

calculator.add(1,1);

运行时出现错误:

TypeError: this.otherClass.shoutOut is not a function

最佳答案

您的问题是您的代理总是 为访问的任何属性(包括this.otherClass)返回一个函数。您将需要使用

const instanceHandler = {
get(target, prop, receiver) {
console.log(target.constructor.name);
const orig = Reflect.get(target, prop, receiver);
if (typeof orig == "function") {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return function (...args) {
const result = orig.apply(this, args);
console.log(prop + JSON.stringify(args) + ' -> ' + JSON.stringify(result));
return result;
};
} else {
return orig;
}
}
};

另请注意,您不需要 instanceHandler 中的 apply 陷阱,因为您的实例都不是函数。

关于javascript - 反射似乎正在失去这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51213559/

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