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

Sep*_*ram 25 javascript

是否可以通过实现其中的任何一个callapply以其他方式使对象可调用?例如:

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

...

obj (a, b);
Run Code Online (Sandbox Code Playgroud)

Max*_*Max 20

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

function foo(){}
foo.myProperty = "whatever";
Run Code Online (Sandbox Code Playgroud)

编辑:要"制作"一个可调用的对象,你仍然必须执行上述操作,但它可能看起来像:

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

然后你只需使用"func"函数而不是对象.实际上所有这个方法都是两个对象之间的复制属性,但是......它可能对你有帮助.

  • 我希望有一些符号,你可以设置一个对象可调用,如`obj [Symbol.invoke] = function(args){};` (4认同)

0xc*_*0de 14

ES6现在有更好的解决方案.如果您(使用创建以不同的方式你的对象class,extend荷兰国际集团"功能"型),你可以拥有它的可调用的实例.

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

  • 每个“类”都有一个“扩展”,因此您宁愿使用它来解决该语言的问题,重用您可能应该在类内聚合的代码,或者应该仅将其用于域对象中的自然连接? (2认同)
  • 如果您还提供了代码片段,那就太好了。 (2认同)

小智 7

其他人提供了当前的答案(“否”)和一些解决方法。至于未来一流的支持,我向 es-discuss 邮件列表建议了这一点。当时这个想法并没有取得多大进展,但也许一些额外的兴趣会有助于让这个想法再次付诸实践。

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


Rod*_*ues 5

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

Object.assign(func, obj);
Object.setPrototypeOf(func, Object.getPrototypeOf(obj));
Run Code Online (Sandbox Code Playgroud)