【问题标题】:Harmony proxy, detect whether property was accessed or calledHarmony代理,检测属性是否被访问或调用
【发布时间】:2015-02-16 10:14:17
【问题描述】:

有没有办法使用代理来检测一个属性是被执行了,还是刚刚被访问?

'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,最好是分开。 try...catch 块不是一个选项。

谢谢

【问题讨论】:

    标签: javascript ecmascript-harmony


    【解决方案1】:

    有没有办法使用代理来检测一个属性是被执行了,还是刚刚被访问?

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

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

    【讨论】:

    【解决方案2】:

    我只是代理的初学者,但据我所知,代理无法满足您的需求。它只是将您正在寻找的财产归还给您,它不知道您将如何使用它。

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多