Can you make an object 'callable'?
Solution 1:
No, but you can add properties onto a function, e.g.
function foo(){}
foo.myProperty = "whatever";
EDIT: to "make" an object callable, you'll still have to do the above, but it might look something like:
// Augments func with object's properties
function makeCallable(object, func){
for(var prop in object){
if(object.hasOwnProperty(prop)){
func[prop] = object[prop];
}
}
}
And then you'd just use the "func" function instead of the object. Really all this method does is copy properties between two objects, but...it might help you.
Solution 2:
ES6
has better solution for this now. If you create your objects in a different way (using class
, extend
ing 'Function' type), you can have a callable instance of it.
See also: How to extend Function with ES6 classes?
Solution 3:
Following the same line of @Max, but using ES6 extensions to Object
to pass all properties and prototype of an object obj
to the callable func
.
Object.assign(func, obj);
Object.setPrototypeOf(func, Object.getPrototypeOf(obj));
Solution 4:
Others have provided the current answer ("no") and some workarounds. As far as first-class support in the future, I suggested this very thing to the es-discuss mailing list. The idea did not get very far that time around, but perhaps some additional interest would help get the idea moving again.
https://esdiscuss.org/topic/proposal-default-object-method