Is it possible to make an object callable by implementing either call
or apply
on it, or in some other way? E.g.:
var obj = {};
obj
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.
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?
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
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));