你能让一个对象“可以调用”吗?

时间:2013-10-12 15:36:17

标签: javascript

是否可以通过在其上实现callapply或以其他方式使对象可调用? E.g:

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

...

obj (a, b);

4 个答案:

答案 0 :(得分:19)

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

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”函数而不是对象。实际上所有这个方法都是两个对象之间的复制属性,但是......它可能对你有帮助。

答案 1 :(得分:13)

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

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

答案 2 :(得分:2)

紧跟@Max的同一行,但是使用Object的ES6扩展将对象obj的所有属性和原型传递给可调用的func

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

答案 3 :(得分:0)

其他人提供了当前答案(“否”)和一些解决方法。至于将来的一流支持,我在es-discuss邮件列表中建议了这一点。那个想法到那时还没有走得很远,但是也许有些额外的兴趣将有助于使这个想法再次发生。

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