ES6代理调用方法作为属性

时间:2017-10-29 05:19:10

标签: javascript node.js es6-proxy

我有以下使用Proxy获取属性和方法的类:

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中执行此操作的方法。

0 个答案:

没有答案