O que é retornado de um construtor?

Se eu retornar algum valor ou object na function de construtor, o que o var obterá?

function MyConstroctor() { //what in case when return 5; //what in case when return someObject; } var n = new MyConstroctor(); 

o que n vai nos dois casos?

Na verdade, é uma questão de questionário, qual será a resposta?
O que é retornado de um construtor de object personalizado?
a) O object recém-instanciado
b) undefined – os construtores não retornam valores
c) Qualquer que seja a declaração de retorno
d) Qualquer que seja a declaração de retorno; o object recém-instanciado se não houver instrução de retorno

Eu encontrei este ótimo link:

JavaScript: valor de retorno do construtor

A segunda peça de mágica iludida acima é a capacidade de um construtor retornar um object específico, possivelmente pré-existente, em vez de uma referência a uma nova instância. Isso permitiria que você gerencie o número de instâncias reais, se necessário; possivelmente por razões de resources limitados ou outros enfeites.

 var g_deebee = new Deebee(); function Deebee() { return g_deebee; } var db1 = new Deebee(); var db2 = new Deebee(); if (db1 != db2) throw Error("JS constructor returned wrong object!"); 

Resposta curta

O construtor retorna o object this .

 function Car(){ this.num_wheels = 4; } // car = {num_wheels:4}; var car = new Car(); 

Resposta longa

Pela especificação do Javascript, quando uma function é chamada com new , o Javascript cria um novo object, em seguida, define a propriedade “constructor” desse object para a function invocada e, por fim, atribui esse object ao nome this . Você então tem access ao object this para o corpo da function.

Uma vez que o corpo da function é executado, o Javascript retornará:

QUALQUER object se a function retorna manualmente um:

 function Car(){ this.num_wheels = 4; return {num_wheels:37}; } var car = new Car(); alert(car.num_wheels); // 37! 

O object this se a function não tiver instrução de return OU se a function retornar um valor de um tipo diferente de object

 function Car() { this.num_wheels = 4; return 'VROOM'; } var car = new Car(); alert(car.num_wheels) // 4 alert(Car()); // No 'new', so this alerts 'VROOM' 

Basicamente, se seu construtor retorna um valor primitivo , como uma string, número, booleano, nulo ou indefinido, (ou você não retorna nada que seja equivalente a retornar undefined ), um object recém-criado que herda do prototype do construtor será devolvida.

Esse é o object que você tem access com a palavra this chave this dentro do construtor quando chamada com a new palavra-chave.

Por exemplo:

 function Test() { return 5; // returning a primitive } var obj = new Test(); obj == 5; // false obj instanceof Test; // true, it inherits from Test.prototype Test.prototype.isPrototypeOf(obj); // true 

Mas se o valor retornado for uma referência de object, esse será o valor retornado, por exemplo:

 function Test2() { this.foo = ""; // the object referred by `this` will be lost... return {foo: 'bar'}; } var obj = new Test2(); obj.foo; // "bar" 

Se você estiver interessado nos componentes internos do new operador, você pode verificar o algoritmo da operação interna [[Construct]] , é o responsável por criar o novo object que herda do protótipo do construtor, e decidir o que retornar:

13.2.2 [[Construct]]

Quando o método interno [[Construct]] de um object Function F é chamado com uma lista de argumentos possivelmente vazia, as seguintes etapas são executadas:

  1. Deixe obj ser um object ECMAScript nativo recém-criado.
  2. Defina todos os methods internos de obj conforme especificado em 8.12.
  3. Defina a propriedade interna [[Class]] do obj como "Object" .
  4. Defina a propriedade interna [[Extensible]] do obj como true .
  5. Seja proto o valor de chamar a propriedade interna [[Get]] de F com o argumento "prototype" .
  6. Se Type(proto) for Object , set the propriedade interna [[Prototype]] `de obj para proto.
  7. Se Type(proto) não for Object, defina a propriedade interna [[Prototype]] de obj para o object de protótipo Object padrão interno, conforme descrito em 15.2.4.
  8. Deixe o resultado ser o resultado de chamar a propriedade interna [[Call] ] de F, fornecendo obj como este valor e fornecendo a lista de argumentos passada para [[Construct]] como args.
  9. Se Type(result) for Object, retorne o resultado.
  10. Retornar obj .

Você não deve retornar nada em um construtor . Um construtor é usado para inicializar o object. Caso você queira saber o que acontece é que se você retornar 5 então n será simplesmente um object vazio e se você retornar por exemplo { a: 5 } , então n terá uma propriedade a=5 .

Para responder a sua pergunta específica:

 function MyConstructor() { return 5; } var n = new MyConstructor(); 

n é uma instância de object do MyConstructor.

 function SomeObject(name) { this.name = name; this.shout = function() { alert("Hello " + this.name) } } function MyConstructor() { return new SomeObject("coure06"); } var n = new MyConstructor(); n.shout(); 

n é uma instância de SomeObject (call n.shout () para provar isso)

Para deixar tudo isso absolutamente claro …

1) Se você retornar um tipo primitivo, como um número ou uma string, ele será ignorado. 2) Caso contrário, você irá devolver o object

Funções e construtores são exatamente os mesmos em JavaScript, mas como você os chama muda seu comportamento. Um exemplo rápido disso está abaixo …

 function AddTwoNumbers(first, second) { return first + second; } var functionCall = AddTwoNumbers(5, 3); alert(functionCall);// 8 var constructorCall = new AddTwoNumbers(5, 3); alert(constructorCall);// object 

É tão fácil quanto foi dito na documentação (novo operador) :

O object retornado pela function construtora se torna o resultado de toda a new expressão. Se a function construtora não retornar explicitamente um object , o object criado na etapa 1 será usado. (Normalmente, os construtores não retornam um valor, mas podem optar por fazer isso, caso desejem replace o processo normal de criação de objects.)