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

Can you make an object 'callable'?

本文关键字:可调用 调用 一个对象      更新时间:2023-09-26

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

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现在有更好的解决方案。如果以不同的方式创建对象(使用 classextend ing "Function" 类型),则可以拥有它的可调用实例。

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

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

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

其他人提供了当前的答案("否")和一些解决方法。至于未来的一流支持,我向es-discussion邮件列表推荐了这件事。那次这个想法并没有走得太远,但也许一些额外的兴趣会有助于让这个想法再次发展。

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

"CALLABLE OBJECTS"
我还没有看到提到这种类型的答案..但这就是我做"可调用"对象的方式:
<<伪代码>>

{...objectWithFunctionsInside}[keyString](optionalParams)
在我的定义

中,如果我只想要一个"可调用对象",则定义第一个、最简单和首选方法的简短示例:

let obj = { 
  o:()=>{return("oranges")},
  b:()=>{return("bananas")},
  s:"something random here, doesn't have to be functions"
}
obj["o"]()

函数的返回中运行的无名对象的简短示例,带有参数(注意参数在第一个示例中也有效):

function autoRunMyObject(choice,param){
  return{
    o:(p)=>{return(p+"oranges")},
    b:(p)=>{return(p+"bananas")},
  }[choice](param)
}
autoRunMyObject("b","orange you glad I didn't say ")

差不多就是这样你甚至可以变得更奇怪,并执行自动运行并立即产生输出的无名称函数......无缘无故,哈哈。...按 F12 并将此代码复制到浏览器控制台并按 Enter 键,您将立即获得包含完整字符串的输出:

((autoparam="o")=>{return{
  o:(p)=>p+"oranges",
  b:(p)=>p+"bananas",
}[autoparam]("I guess this time it's ")})()

您甚至可以在最后一个括号中传入"b"字符串,以获得与默认"o"不同的输出。

此外,我的每个示例(减去伪代码的第一个示例)都可以轻松地复制/粘贴到浏览器控制台中进行快速测试 - 这是试验JS的好地方。

总之——这就是我喜欢做"可调用对象"
的方式它比
开关(){案例:中断;};
声明和
IF{}ELSE IF(){}ELSE IF(){};
链。