What are the exact circumstances for which a return statement in Javascript can return a value other than this when a constructor is invoked using
The exact condition is described on the [[Construct]] internal property, which is used by the new operator:
From the ECMA-262 3rd. Edition Specification:
13.2.2
[[Construct]]When the
[[Construct]]property for aFunctionobjectFis called, the following steps are taken:
- Create a new native ECMAScript object.
- Set the [[Class]] property of
Result(1)to"Object".- Get the value of the prototype property of
F.- If
Result(3)is an object, set the [[Prototype]] property ofResult(1)toResult(3).- If
Result(3)is not an object, set the [[Prototype]] property ofResult(1)to the originalObjectprototype object as described in 15.2.3.1.- Invoke the [[Call]] property of
F, providingResult(1)as thethisvalue and providing the argument list passed into[[Construct]]as the argument values.- If
Type(Result(6))isObjectthen returnResult(6).- Return
Result(1).
Look at steps 7 and 8, the new object will be returned only if the
type of Result(6) (the value returned from the F constructor
function) is not an Object.