您可以将对象设为“可调用”吗?

问题描述 投票:25回答:4

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

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

...

obj (a, b);
javascript
4个回答
20
投票

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

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


13
投票

ES6现在对此有了更好的解决方案。如果您以其他方式创建对象(使用classextend“函数”类型),则可以拥有它的可调用实例。

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


3
投票

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

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

1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.