Jesteś poprawne dostaniesz wystąpienie moo
Powodem tego jest tak niejednoznaczne, dlatego zawsze, gdy używany jest nowe słowo kluczowe, the newly created object's constructor is not executed until 'this' keyword is used
. nowy obiekt jest powiązany z tym słowem kluczowym.
odnoszą się to z: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
Gdy kod new Foo (...) jest wykonywane następujące konsekwencje:
- Nowy obiekt jest tworzony, dziedziczenie z foo.prototype .
- Funkcja konstruktora foo jest wywoływana z określonymi argumentami i jest związana z nowo utworzonym obiektem. nowy foo to równoważny nowemu foo(), tj. jeśli nie podano żadnej listy argumentów, foo jest wywoływana bez argumentów.
- Obiekt zwracany przez funkcję konstruktora staje się wynikiem całego nowego wyrażenia. Jeśli funkcja konstruktora nie powiela jawnie obiektu, obiekt utworzony w kroku 1 jest używany zamiast tego. (Konstruktorzy zwykle nie zwraca wartości, ale mogą zdecydujesz się zrobić, jeśli chcą zastąpić normalny proces tworzenia Object).
W przykładzie zbyt tworzony jest nowy obiekt, ale "to" słowo kluczowe nie jest używane, a zatem konstruktor dla foo nie jest wywoływany, a zatem funkcja właśnie kończy się zwracaniem obiektu 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");
}
Edycja: Odpowiedź na pytanie postawione przez @Desu
id = 0;
var foo = function(){
}
if(new foo() instanceof foo){
alert("yes"); //alerts yes
}
JavaScript konstruktorów 101:
- Domyślne zachowanie konstruktora jest powrót „to "jeśli nic innego nie zostanie zwrócone
- Jeśli inny obiekt jest zwracany z konstruktora nowo utworzony obiekt związany z „ta” zostanie odrzucone
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
}
to dlatego, że słowo kluczowe nie jest używane !! – user2580076