你能使一个对象“可调用”吗?
Can you make an object 'callable'?
是否可以通过在对象上实现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" 类型),则可以拥有它的可调用实例。
另请参阅:如何使用 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(){};
链。
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- 在javascript中调用函数/对象引用时,可容纳任何数据类型
- 使变量可用于不带闭包的异步调用
- Google可视化addListener调用函数引用错误
- 在隐藏值上调用 jQuery .trigger('change') 会破坏与 KNOCKOUT 相关的可观察性
- Google Gauge(数据图表可视化)未加载到ajax调用的页面中
- 当draggable使嵌套可排序时调用Drop
- 多个AJAX调用调用相同的成功函数不起作用
- 补间.js添加事件侦听器后不调用调用函数
- 使用函数调用调用 jQuery 弹出窗口
- 如何使用 jquery Ajax 调用调用类的方法
- jQuery从不为ajax调用调用.done()或.always()
- 一个HTML按钮可连续调用3个函数
- 编写一个可任意调用次数的curried javascript函数,该函数在最后一次函数调用时返回值
- 使用angular js-ajax调用调用php-json服务文件
- 通过javascript调用调用jsp页面
- Angular Service可以在控制器中调用调用该服务的函数吗?
- 在jquery中从ajax调用调用Javascript函数
- 有没有一种安全的方法可以调用“调用”来调用 JavaScript 中的函数
- 在rails 3中,如何使用page.调用调用函数并向其传递多个参数