示例:
function Queue() {
}
var q = new Queue();
当像函数一样调用时,是否可以让q
调用方法?调用q()
只会出错:
TypeError:object不是函数
答案 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中疯狂。很快。