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

问题描述 投票:0回答:2

有没有办法使用代理来检测属性是否被执行,或者是否刚刚被访问?

'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
2个回答
1
投票

有没有办法使用代理来检测属性是否被执行,或者是否刚刚被访问?

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

您需要返回一个函数(以便可以调用它),但也需要模仿一个字符串,也许可以通过篡改该函数对象的

.valueOf()
/
.toString()
/
[Symbol.toPrimitive]()
方法来实现。


1
投票

我只是代理的初学者,但据我所知,代理不能做你需要的事情。它只是给你返回你正在寻找的属性,它不知道你将如何使用它。

© www.soinside.com 2019 - 2024. All rights reserved.