和声代理,检测属性是否被访问或调用

时间:2014-12-17 18:55:53

标签: javascript ecmascript-harmony

是否有办法使用Proxy来检测属性是否已执行,或者是否刚刚访问过该属性?

'use strict';

require('harmony-reflect');

var Stub = {
    method: function (a) {
        console.log('q' + a + this.q);
    }
};

var ProxiedLibrary = {
    get: function (target, name, receiver) {
        if (name in target) {
            return target[name];
        }

        if (MAGIC_EXPRESSION) {
            return function() {
                return 'Return from nonexistent function!';
            };
        }

        return 'Property ' + name + ' is drunk and not available at the moment';
    }
};

var Library = new Proxy(Stub, ProxiedLibrary);

console.log(Library.nonexistent); //Everything is cool
console.log(Library.nonexistent()); //TypeError we don't want

我非常想模仿php的__call和__get,最好是分开。尝试...抓住阻止不是一种选择。

谢谢

2 个答案:

答案 0 :(得分:1)

我只是一个有代理的初学者,但据我所知,代理无法满足您的需求。它只是为您提供了您正在寻找的财产,它无法知道您将如何使用它。

答案 1 :(得分:1)

  

是否有办法使用Proxy来检测属性是否已执行,或者是否刚刚访问过该属性?

不,因为JavaScript不区分属性和方法。它只是被访问的属性,如果它是一个函数,则可以调用它们的值。

您需要返回一个函数(以便可以调用它),但也可以通过篡改该函数的.valueOf() / .toString() / @@toPrimitive方法来模仿字符串对象