I found something very odd today: If you create objects with a constructor function and the new keyword, but return a function from the constructor, it behaves like so:
- The newly-created "object" is instead a function.
- That new function can be invoked like normal, however...
- If you maintain a reference to
thisin the constructor function,thisreferences an object that was correctly created from the constructor. It's what you expected to be returned fromnew.
Here's an example:
function Constructor() {
var self = this;
this.name = 'instance';
return function() {
return self;
}
}
So if you instantiated it like this: var instance = new Constructor()
The following would result:
typeof instance //returns "function"
typeof instance() //returns "object"
instance() //returns { name: 'instance' }
So I guess I have three questions:
- Is this legal and does it work cross-browser? It's really awesome and I think it can be used in a lot of ways, but is this behavior dependable?
- What happens in the background that causes this behavior?
- (maybe answered by 2, but...) Is the new object (the one referenced with 'this') inside the new instance, so that it's all self-contained and is cleaned up properly by the garbage collector?