2013-08-11 13 views
5

Jestem nowy w JavaScript, a teraz studiuje go ...dwa różne sposoby, aby javascript obiektów

var person = function() { 
    this.name = "name" 
}; 

var person2 = function() { 
    var obj = {}; 
    obj.name = "name"; 
    return obj; 
}; 

Załóżmy mamy dwie funkcje pokazane powyżej. Wygląda na to, że obiekty można tworzyć za pomocą dowolnej z tych funkcji. Na przykład)

var p = new person(); 
var p2 = new person2(); 

Moje pytanie brzmi: jaka jest różnica między osobą a osobą 2? Czy one są dokładnie takie same? Jeśli nie, który jest bardziej preferowany sposób użycia?

Dzięki

+1

Pierwszy raz jest funkcją konstruktora, drugi to tylko funkcja zwracająca obiekt i może być również wywołana bez 'nowego'. Jest różnica, która powinna się wyjaśnić, gdy czytasz o 'new': https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new. –

+0

@FelixKling Oprócz tego * jest * wywoływane z 'new', który zmienia rzeczy. –

+0

@Andrew: Niezupełnie dlatego, że funkcja * jawnie * zwraca obiekt. Wywołanie go z lub bez "nowego" nie ma znaczenia. (Oczywiście robi to różnicę w tym zakresie, że "to" odnosi się do różnych wartości wewnątrz funkcji, ale nie robi różnicy dla wyniku wywołania funkcji). –

Odpowiedz

2

Normalny sposób tworzenia obiektu to pierwszy sposób.

Drugi sposób spowoduje utworzenie dwóch obiektów, a jeden zostanie odrzucony. Jeden obiekt zostanie utworzony przed wywołaniem funkcji, tak jak w przypadku pierwszej metody, ale ponieważ funkcja zwraca inny obiekt, pierwszy obiekt zostanie odrzucony, a użyty obiekt zostanie użyty.

Ważna różnica między metodami polega na tym, że druga nie może używać prototypu. Wszystko, co umieścisz w prototypie funkcji, zostanie zastosowane do obiektu, który zostanie odrzucony.

+2

Nie zgadzam się z tym, że pierwszy sposób jest normalny. Myślę, że normalnym sposobem jest 'var p2 = {name:" name "};', prawdopodobnie z obiektem zwróconym przez funkcję, jeśli jest używana w wielu miejscach. –

+0

@PeterOlson: Jest to normalny sposób używania słowa kluczowego 'new'. Jeśli nie chcesz tego zrobić, to zupełnie inna sprawa. – Guffa

+0

Zgadzam się z tobą tam, ale myślę, że to mylące stwierdzenie, że to normalny sposób tworzenia obiektu. –

1

Różnica polega na sposobie korzystania z funkcji.

Pierwsza z nich jest przeznaczona do użycia jako konstruktor , this dla nowo utworzonego obiektu. Jest on przeznaczony do stosowania w połączeniu z operatorem new, w następujący sposób:

var bill = new person(); 

To jest po prostu jak normalny konstruktor jak w typowym języku OOP.


Drugi ma być stosowany jako zwykły funkcji (bez new), np .:

var bill = person(); 

można wykorzystać w ten sposób tworzenia obiektów w połączeniu z builder pattern.

+0

Warto zauważyć, że druga z nich nie dziedziczy po prototypie konstruktora (widoczna, ale znacząca zmiana). –

Powiązane problemy