2013-10-12 69 views
12

是否可以通过对其执行callapply或以其他方式执行对象调用?例如:你可以让一个对象“可调用”吗?

var obj = {}; 
obj.call = function (context, arg1, arg2, ...) { 
    ... 
}; 

... 

obj (a, b); 
+3

不,这是不可能的。一个对象必须作为一个实例化的函数被调用。 [构造在JavaScript调用对象]的 – Pointy

+0

可能重复(http://stackoverflow.com/questions/12656079/constructor-for-callable-object-in-javascript) –

+0

@HansZ不是真的,我的问题是有关使*现有*对象可调用,而不是创建一个新对象。 – Septagram

回答

13

不,但您可以将属性添加到函数中,例如,

function foo(){} 
foo.myProperty = "whatever"; 

编辑:“做”的对象可调用的,你仍然必须做以上,但它可能看起来像:

// Augments func with object's properties 
function makeCallable(object, func){ 
    for(var prop in object){ 
     if(object.hasOwnProperty(prop){ 
      func[prop] = object[prop]; 
     } 
    } 
} 

然后你只需要使用“ func“函数而不是对象。真的,这个方法所做的就是复制两个对象之间的属性,但是......它可能会帮助你。

+0

是的,但你如何复制原型链?我需要一个可调用的函数/对象,但实际上是一个类型的实例。 –

+0

我希望有一个符号可以让对象像'obj [Symbol.invoke] = function(args){};}调用;' –

9

ES6现在有这个更好的解决方案。如果以不同的方式创建对象(使用'Function'类型),则可以有一个可调用的实例。

另请参阅:How to extend Function with ES6 classes?

+0

我不会说它更好。这个解决方案对主流浏览器的支持更好,实际上迫使人们使用这个解决方案而不是替代品。但它并没有使这个解决方案更好。这种解决方案是违反直觉的,与其他OOP方法不兼容。 – wandalen

+0

@wandalen恐怕我不明白你想说什么。无论如何,更直观(至少对于来自C++或java - OOP的解决方案)解决方案更易读,更清洁,并且(实际上是)更好,不是吗?为什么你认为一个扩展'Function'的类创建一个可调用的,不直观? – 0xc0de

相关问题