Cosa viene restituito da un costruttore?

Se restituisco qualche valore o object nella funzione di costruzione, cosa otterrà la var?

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

cosa otterrà in entrambi i casi?

In realtà è una domanda a quiz, quale sarà la risposta?
Cosa viene restituito da un costruttore di oggetti personalizzati?
a) L’object appena istanziato
b) indefinito – i costruttori non restituiscono valori
c) Qualunque sia la dichiarazione di ritorno
d) Qualunque sia la dichiarazione di ritorno; l’object appena istanziato se nessuna dichiarazione di ritorno

Ho trovato questo ottimo link:

JavaScript: valore di ritorno del costruttore

Il secondo pezzo di magia eluso sopra è la possibilità per un costruttore di restituire un object specifico, eventualmente preesistente, piuttosto che un riferimento a una nuova istanza. Questo ti permetterebbe di gestire il numero di istanze reali te stesso se necessario; forse per ragioni di risorse limitate o quant’altro.

 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!"); 

Risposta breve

Il costruttore restituisce this object.

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

Risposta lunga

Con la specifica Javascript, quando una funzione viene invocata con new , Javascript crea un nuovo object, quindi imposta la proprietà “costruttore” dell’object alla funzione invocata e infine assegna quell’object al nome. Hai quindi accesso a this object per il corpo della funzione.

Una volta eseguito il corpo della funzione, Javascript restituirà:

QUALSIASI object se la funzione restituisce manualmente uno:

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

this object se la funzione non ha un’istruzione return O se la funzione restituisce un valore di un tipo diverso 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' 

Fondamentalmente se il tuo costruttore restituisce un valore primitivo , come una stringa, un numero, un booleano, un valore nullo o indefinito, (o non restituisci nulla che equivale a restituire undefined ), un object appena creato che eredita dal prototype del costruttore sarà restituito.

Questo è l’object a cui hai accesso con this parola chiave all’interno del costruttore quando viene chiamato con la new parola chiave.

Per esempio:

 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 

Ma se il valore restituito è un riferimento a un object, questo sarà il valore restituito, ad esempio:

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

Se sei interessato agli interni del new operatore, puoi controllare l’algoritmo dell’operazione interna [[Construct]] , è l’unico responsabile della creazione del nuovo object che eredita dal prototipo del costruttore e decidere cosa restituire:

13.2.2 [[Construct]]

Quando il metodo interno [[Construct]] per un object Function F viene chiamato con una lista di argomenti potenzialmente vuota, vengono eseguiti i seguenti passi:

  1. Sia obj un object nativo ECMAScript appena creato.
  2. Impostare tutti i metodi interni di obj come specificato in 8.12.
  3. Impostare la proprietà interna [[Class]] di obj su "Object" .
  4. Impostare la proprietà interna [[Extensible]] di obj su true .
  5. Sia proto il valore di chiamare la proprietà interna [[Get]] di F con argomento "prototype" .
  6. Se Type(proto) è Object , set the proprietà interna di [[Prototype]] di obj su proto.
  7. Se Type(proto) non è Object, imposta la proprietà interna [[Prototype]] di obj sull’object prototipo Object predefinito incorporato come descritto in 15.2.4.
  8. Sia risultato il risultato di chiamare la proprietà interna [[Call] ] di F, fornendo obj come valore e fornendo l’argomento list passato in [[Construct]] come argomenti.
  9. Se Type(result) è Object, restituisce il risultato.
  10. Ritorno obj .

Non dovresti restituire nulla in un costruttore . Un costruttore viene utilizzato per inizializzare l’object. Nel caso in cui vuoi sapere cosa succede è che se restituisci 5 allora n sarà semplicemente un object vuoto e se ritorni per esempio { a: 5 } , allora n avrà una proprietà a=5 .

Per rispondere alla tua domanda specifica:

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

n è un’istanza di object di 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 è un’istanza di SomeObject (chiama n.shout () per dimostrarlo)

Per rendere tutto ciò assolutamente chiaro …

1) Se si restituisce un tipo primitivo, come un numero o una stringa, verrà ignorato. 2) Altrimenti, restituirai l’object

Le funzioni e i costruttori sono esattamente gli stessi in JavaScript, ma il modo in cui li chiami cambia il loro comportamento. Un rapido esempio di questo è sotto …

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

È facile come ha detto nella documentazione (nuovo operatore) :

L’object restituito dalla funzione di costruzione diventa il risultato di tutta la new espressione. Se la funzione di costruzione non restituisce esplicitamente un object , viene utilizzato l’object creato nel passaggio 1. (Normalmente i costruttori non restituiscono un valore, ma possono scegliere di farlo se vogliono sovrascrivere il normale processo di creazione dell’object.)