我有以下类使用代理来获取属性和方法:
class User extends Model {
static table = 'users';
_attributes = {
id: 1,
firstName: 'Testing',
lastName: 'Test'
};
constructor() {
return new Proxy(this, {
get: function(target, name) {
// proxy getting code for functions and properties
}
});
}
client() {
return this.hasOne(Client, 'clientID');
}
}
在代理的 get 方法中,检索属性是微不足道的。我只是检查它们在 中是否存在_attributes
,然后返回值,否则返回 null。
if (target._attributes.hasOwnProperty(propertyName)) {
return target._attributes[name];
}
return null;
然后我可以将其用作:
const user = new User();
console.log(user.id); // returns 1
console.log(user.firstName); // returns "Testing"
在代理的 get 方法中,我还可以检查调用的属性是否为函数,并返回相应的函数作为结果:
if (typeof target[name] === 'function') {
const originalFunction = target[name];
return function(...args) {
return originalFunction.apply(this, args);
};
}
然后我可以将其用作:
const user = new User();
user.client(); // Returns the return value of client() from the class
但是,在代理的 get 函数中,我无法区分user.client()
和user.client
。在第一种情况下,我想返回函数的结果。在第二种情况下,我想检索函数的结果,执行一个额外的步骤,然后返回它。
在伪代码中:
if (property is a function call) {
return property();
}
else if (property is a function, but not a function call) {
return property().doSomethingElse();
}
使用代理,我可以区分get 方法之间user.client()
的区别吗?user.client
在 PHP 中,这可以使用魔术方法__get
vs __call
,但我正在寻找一种在 Javascript 中执行此操作的方法。