ho trovato qualcosa di molto strano oggi: se si crea oggetti con una funzione di costruzione e la parola chiave new
, ma return
una funzione dal costruttore, si comporta in questo modo:Usando 'ritorno' per la creazione di oggetti con 'nuovo'
- Il "oggetto" appena creato è invece una funzione.
- Questa nuova funzione può essere invocata come normale, però ...
- Se si mantiene un riferimento alla
this
nella funzione di costruzione,this
riferimento a un oggetto che è stato correttamente creato dal costruttore. È quello che ti aspettavi di essere restituito danew
.
Ecco un esempio:
function Constructor() {
var self = this;
this.name = 'instance';
return function() {
return self;
}
}
Quindi, se avete istanziato in questo modo: var instance = new Constructor()
Di seguito si tradurrebbe:
typeof instance //returns "function"
typeof instance() //returns "object"
instance() //returns { name: 'instance' }
Quindi credo Ho tre domande:
- È legale e funziona? k cross-browser? È davvero fantastico e penso che possa essere usato in molti modi, ma questo comportamento è affidabile?
- Cosa succede in background che causa questo comportamento?
- (forse ha risposto con 2, ma ...) Il nuovo oggetto (quello referenziato con 'this') all'interno della nuova istanza, in modo che sia tutto autonomo e che venga corretto correttamente dal garbage collector?
È sbagliato restituire qualcosa da un costruttore, l'ultima volta che l'ho sentito. –