在JavaScript对象上定义__invoke魔术方法?

时间:2014-02-25 04:50:27

标签: javascript

示例:

function Queue() {
}

var q = new Queue();

当像函数一样调用时,是否可以让q调用方法?调用q()只会出错:

  

TypeError:object不是函数

2 个答案:

答案 0 :(得分:1)

使代码工作的最简单方法是从构造函数返回一个函数:

function Queue()
{
    return function() {
        alert('Hello world');
    };
}

这是有效的,因为从构造函数返回一个对象将"替换"否则将是Queue的一个实例。基本上,这种方法允许您返回一个"公共界面"并且Queue的实例可以关闭:

function Queue()
{
    var self = this; // instance of Queue

    return function() {
        // use 'self'
        alert('Hello world');
    };
}

但是您从构造函数返回的内容现在不再是Queue实例,因此无法使用像PHP这样的真__invoke()

更新

用例(在删除之前)是这样的:

function Queue() {
    var q = [];

    return function(f) {
        q.push(f);

        return function(status) {
            if(q.length > 0) {
                return q.shift()();
            }
        }
    };
}

var q = Queue(),
a = q(function() { console.log('a'); }),
b = q(function() { console.log('b'); });

b(); a(); // prints 'a' and then 'b'

答案 1 :(得分:1)

首先,javascript默认执行此操作。如果你创建一个对象的变量,如果你试图调用它,它就会抛出一个异常,说明对象不是一个函数。

其次,如果您以任何方式寻找类似php的魔术方法,那么只需Proxy即可。

var x = new Proxy({},{get(target,name) {
  return "Its hilarious you think I have "+name
}})

console.log(x.hair) // logs: "Its hilarious you think I have hair"

查看MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

适用于chrome,firefox和node.js.缺点:在IE中还没有工作 - 在IE中疯狂。很快。