Javascript 你能制造一个物体吗';可调用&x27;?

Javascript 你能制造一个物体吗';可调用&x27;?,javascript,Javascript,是否可以通过在对象上实现call或apply或以其他方式使对象可调用?例如: var obj = {}; obj.call = function (context, arg1, arg2, ...) { ... }; ... obj (a, b); 不可以,但您可以在函数中添加属性,例如 function foo(){} foo.myProperty = "whatever"; 编辑:要“使”对象可调用,您仍然需要执行上述操作,但它可能看起来像: // Augments func

是否可以通过在对象上实现
call
apply
或以其他方式使对象可调用?例如:

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

...

obj (a, b);

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

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”函数代替对象。实际上,此方法所做的只是在两个对象之间复制属性,但是……它可能会帮助您。

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


另请参见:

在@Max的同一行之后,但使用
对象的ES6扩展来将对象
obj
的所有属性和原型传递给可调用的
func

Object.assign(func, obj);
Object.setPrototypeOf(func, Object.getPrototypeOf(obj));

其他人提供了当前答案(“否”)和一些解决办法。至于将来的一流支持,我向es讨论邮件列表建议了这件事。当时,这个想法并没有走得很远,但也许一些额外的兴趣将有助于这个想法再次付诸实施


不,那是不可能的。对象必须是“天生”可调用的实例化函数。@HansZ的可能副本不太可能,我的问题是如何使现有对象可调用,而不是创建新对象。非常相关:下面是一个优雅的答案,我不认为它更好。主要浏览器更好地支持该解决方案,因为它实际上迫使人们使用该解决方案,而不是替代方案。但这并不能让这个解决方案变得更好。此解决方案违反直觉,与其他OOP方法不兼容。@wandalen恐怕我不明白你想说什么。无论如何,一个更可读、更干净、(实际上是)直观的(至少是来自C++或java -OOP)的解决方案更好,不是吗?为什么你认为一个类扩展“函数”来创建一个可调用的函数是不直观的?你可以在每个“类”中得到一个
extends
,所以你宁愿用它来解决语言的问题,重用您可能应该在类内部聚合的代码,或者应该仅将其用于域对象中的自然连接?是的,但是如何复制原型链?我需要一个可调用的函数/对象,但实际上是一个类型的实例
@NickSotiros可能
Object.setPrototypeOf(func,Object)
?仅供参考:在NodeJS中,如果属性名称与函数对象上的只读属性(例如
name
)冲突,此操作将失败。示例:
(函数(){})。名称=“”
TypeError:无法分配给函数“function(){}”的只读属性“name”