2015-04-02 17 views
6
function Person(age,name){ 
    this.name = name; 
    this.age = age; 
    this.speak = function(){...} 
} 

function Person(age,name){ 
    var p = {} 
    p.name = name; 
    p.age = age; 
    p.speak = function(){...} 
    return p; 
} 

Jedyna różnica widzę jest to, że przy użyciu pierwszy Należy zadzwonić z nowym pozwolić język znać jej budowę nowego obiektu, jest to w zasadzie tylko buduje obiekt, w którym ' to "odnosi się do tworzonego nowego obiektu?Dwa sposoby konstruowania obiektu w JavaScript

tj samo jak to robi.

{ 
    age: 12, 
    name: "mark", 
    speak: function(){...} 
} 

gdzie jako druga zwraca obiekt więc można po prostu napisać

Person(12,"mark") 

zamiast

new Person(12,"mark") 

Więc myślę, że moje pytanie jest, czy jest coś złego w używaniu drugi wersja i czy różnice są poprawne i czy są to jedyne różnice między tymi dwoma?

+0

możliwe duplikat [konstruktor vs funkcji fabryczne] (http://stackoverflow.com/questions/8698726/constructor-function-vs-factory-functions) –

+0

@ Qantas94Heavy - to pytanie jest pytaniem o rzeczy, na które nie zadano odpowiedzi w drugim pytaniu. W moim przekonaniu, to nie jest czysty dup choć oczywiście związany. – jfriend00

Odpowiedz

9

pierwsza:

function Person(age,name){ 
    this.name = name; 
    this.age = age; 
    this.speak = function(){...} 
} 
  1. to nazwana Funkcja konstruktora.
  2. będzie działać poprawnie z instanceof Person
  3. łatwiej jest zrobić wstawek lub klasyczny Javascript dziedziczenie z
  4. Przydałoby prototyp metod, które mogą zużywają mniej pamięci i szybciej konstruować obiektu, jeśli istnieje wiele metod
  5. Może być również zaprojektowany do pracy bez konieczności używania new.
  6. jest bardziej podobny do tego, jak nowa składnia ES6 class i extends działa co jest prawdopodobne, jak dużo JavaScript zostanie zapisany w przyszłości.

drugi:

function Person(age,name){ 
    var p = {} 
    p.name = name; 
    p.age = age; 
    p.speak = function(){...} 
    return p; 
} 
  1. jest funkcją fabryki. Tworzy obiekt ogólny, przypisuje do niego właściwości, a następnie zwraca obiekt.
  2. Może to być dziedziczone, ale nie w klasyczny sposób tylko przez inną funkcję fabryczną, która wie, jak działa ten obiekt. Niektóre typy dziedziczenia mixin nie są tak użyteczne w tej strukturze.
  3. Nie będzie działać z instanceof.
  4. Nie można i nie można użyć prototypu do metod.
  5. można nazwać z new i nadal działa (system utworzony nowy obiekt będzie po prostu wyrzucić).
  6. Umożliwia tworzenie dowolnego rodzaju obiektów. Może nawet rozgałęziać na podstawie przekazanych argumentów lub środowiska i stworzyć inny rodzaj obiektu w oparciu o pewną logikę. Z technicznego punktu widzenia można to zrobić również przy użyciu pierwszego stylu, ale jest on nieefektywny, ponieważ interpreter tworzy określony typ obiektu, a następnie zwróciłby coś innego, co spowodowałoby, że oryginalny obiekt, który został utworzony, został następnie zbuforowany. Tak więc, jeśli zamierzasz tworzyć wiele różnych rodzajów obiektów, druga metoda byłaby bardziej wydajna.

Poza tymi różnicami, dwie będą w większości działać tak samo i nie ma nic "nie tak" pod względem technicznym.

Istnieją zwolennicy obu stylów programowania w JavaScript, a niektórzy twierdzą, że są sytuacje, w których jeden jest bardziej odpowiedni niż inny i odwrotnie. Proponuję zbudować kilka podklas dla tego obiektu, aby wypłukać trochę więcej różnic programistycznych, ponieważ podklasy będą również działać inaczej.


Jeśli chcesz szukać innych artykułów na ten temat, to jest w zasadzie „Funkcja konstruktora vs funkcji fabryki w Javascript”, która czasami wkroczyć w argument za/przeciw użyciu .prototype, ale również również omawia twój temat.

Oto kilka artykułów na ten konkretny temat (które obejmują gamę poglądów):

JavaScript Constructor Functions Vs Factory Functions

Javascript object creation patterns

In defense of JavaScript’s constructors

Constructor function vs Factory functions

Factory constructor pattern

Some Useful JavaScript Object Creation Patterns

Constructors Are Bad For JavaScript

Constructors vs factories