lei ha ragione otterrete un'istanza di moo
La ragione di questo essere così ambiguo è perché ogni volta che viene utilizzato nuova parola chiave, the newly created object's constructor is not executed until 'this' keyword is used
. il nuovo oggetto è associato alla parola chiave 'this'.
riferiscono questo da: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
Quando viene eseguito il nuovo codice di foo (...), le seguenti cose accadono:
- Viene creato un nuovo oggetto, che eredita da foo.prototype .
- La funzione di costruzione foo viene chiamata con gli argomenti specificati e viene associata all'oggetto appena creato. new foo è equivalente a new foo(), cioè se non è specificato alcun elenco di argomenti, foo è chiamato senza argomenti.
- L'oggetto restituito dalla funzione di costruzione diventa il risultato dell'intera nuova espressione. Se la funzione di costruzione non restituisce esplicitamente un oggetto, , l'oggetto creato nel passaggio 1 viene utilizzato invece . (Costruttori normalmente non restituiscono un valore, ma possono scegliere di farlo se vogliono ignorare il normale oggetto creazione processo.)
Nel tuo esempio, anche viene creato un nuovo oggetto, ma 'questa' parola chiave non viene usata e quindi il costruttore per foo non viene chiamato e quindi la funzione termina solo restituendo l'oggetto moo.
http://jsfiddle.net/v5aGu/
var foo = function() {
return new moo();
}
var moo = function() {
return this;
}
var myFoo = new foo(2);
if(myFoo instanceof moo){
alert("moo");
}
if(myFoo instanceof foo){
alert("foo");
}
Modifica: Per rispondere alla domanda sollevata da @Desu
id = 0;
var foo = function(){
}
if(new foo() instanceof foo){
alert("yes"); //alerts yes
}
JavaScript Costruttori 101:
- Il comportamento predefinito di costruttore è di tornare 'questo 'se nient'altro viene restituito
- Se un altro oggetto viene restituito da un costruttore nuovo oggetto creato legato a 'questo' viene scartato
http://jsfiddle.net/xQVuX/1/
id = 0;
var foo = function(){
}
if(new foo() instanceof foo){
alert("foo yes"); //alerts foo yes because foo returns this as a default behavior
}
var foo2 = function(){
var i=new foo();
return i;
}
if(new foo2() instanceof foo2){
alert("foo2 yes");// does not alert because foo2 returns another object and the newly created object is discarded
}
var foo3 = function(){
this.i = 10;
}
if(new foo3() instanceof foo3){
alert("foo3 yes"); // alerts foo3 yes because foo3 returns this as a default behavior
}
perché questa parola chiave non viene utilizzata !! – user2580076