2013-07-21 8 views
7
var foo = function() { 
    return new moo(); 
} 

var moo = function() { 
    return this; 
} 

Gdybym wykonać instrukcjęCzy nowy zwróci nazwaną funkcję konstruktora funkcji?

new foo() 

będę rzeczywiście dostać wystąpienie moo? Wydaje się to jednocześnie oczywiste i nieintuicyjne. Funkcjonalnie tak powinno się stać, ale jednocześnie nie jest to oczekiwane, jeśli nie znasz wewnętrznych elementów.

EDYCJA: Zdałem sobie sprawę, że wydaje się to nieintuicyjne b.c. w konstruktorach języka Java nie można zwrócić niczego.

Jest to bardzo podobne do wzorca konstruktora używanego przez jquery.

Odpowiedz

3

Tak dostaniesz wystąpienie moo.

Nieintuicyjność wynika z faktu, że można zwrócić coś innego niż sam obiekt w konstruktorze javascvipt. Jest to możliwe, ponieważ wszystkie funkcje są w rzeczywistości obiektami w js. W językach takich jak java i C#, które nie są możliwe, konstruktor zawsze zwraca obiekt, do którego należy konstruktor. Nie można również wywoływać kontruktorów bez nowego słowa kluczowego w takich językach. Nie zwracanie niczego z konstruktora jest tak samo cienkie jak return this; w js rzeczy (zakładając, że jest używany konstruktor) również dodaje trochę zamieszania.

+0

to dlatego, że słowo kluczowe nie jest używane !! – user2580076

2

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:

  1. Nowy obiekt jest tworzony, dziedziczenie z foo.prototype .
  2. 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.
  3. 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:

  1. Domyślne zachowanie konstruktora jest powrót „to "jeśli nic innego nie zostanie zwrócone
  2. 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 
} 
+0

@stack_temp "to" odpowiada na twoje pytanie? – user2580076

+0

[link] (http://jsfiddle.net/xQVuX/) 'konstruktor nowo utworzonego obiektu nie jest wykonywany do momentu użycia 'tego' słowa kluczowego' nie jest prawdziwy. sama funkcja jest konstruktorem, jeśli nie zostanie wykonana, nowe moo również nie zostanie wykonane. – Desu

Powiązane problemy