41

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

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

...

obj (a, b);
4

4 回答 4

32

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

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

于 2013-10-12T15:38:15.920 回答
20

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

另请参阅:如何使用 ES6 类扩展函数?

于 2016-11-01T11:25:47.997 回答
5

遵循@Max 的同一行,但使用 ES6 扩展将Object对象的所有属性和原型传递obj给 callable func

Object.assign(func, obj);
Object.setPrototypeOf(func, Object.getPrototypeOf(obj));
于 2019-02-04T06:32:11.477 回答
3

其他人提供了当前答案(“否”)和一些解决方法。至于未来的一流支持,我向 es-discuss 邮件列表提出了这个建议。那个时候这个想法并没有走得太远,但也许一些额外的兴趣会帮助这个想法再次发生。

https://esdiscuss.org/topic/proposal-default-object-method

于 2019-07-23T16:45:06.563 回答