2015-04-02 7 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; 
} 

L'unica differenza che vedo è che utilizzando il primo è necessario chiamare con il nuovo per lasciare che il linguaggio di conoscere la sua costruzione di un nuovo oggetto, è essenzialmente solo la costruzione di un oggetto in cui ' questo 'si riferisce al nuovo oggetto che si sta creando ??Due modi di costruire un oggetto in JavaScript

lo stesso di fare questo.

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

dove come il secondo restituisce un oggetto in modo da poter solo scrivere

Person(12,"mark") 

invece di

new Person(12,"mark") 

Quindi credo che la mia domanda è, è qualcosa che non va con la seconda versione e sono le differenze che ho dichiarato corrette e sono le uniche differenze tra i due?

+0

possibile duplicato di [Funzione di costruzione vs funzioni di fabbrica] (http://stackoverflow.com/questions/8698726/constructor-function-vs-factory-functions) –

+0

@ Qantas94 Heavy: questa domanda richiede alcune cose che non vengono poste né risposte nell'altra domanda. Nel mio opionion, non è un puro dup, anche se ovviamente correlato. – jfriend00

risposta

9

Il primo:

function Person(age,name){ 
    this.name = name; 
    this.age = age; 
    this.speak = function(){...} 
} 
  1. È una funzione di costruzione di nome.
  2. funzionerà correttamente con instanceof Person
  3. è più facile da fare mixins o classico eredità JavaScript con
  4. Potrebbe utilizzare il prototipo per i metodi che possono consumano meno memoria o essere più veloce per costruire un oggetto se ci sono molti metodi
  5. Potrebbe anche essere progettato per funzionare senza richiedere new.
  6. È più simile a come funziona la nuova sintassi ES6 class e extends che è probabile che in futuro verrà scritto molto Javascript.

Il secondo:

function Person(age,name){ 
    var p = {} 
    p.name = name; 
    p.age = age; 
    p.speak = function(){...} 
    return p; 
} 
  1. è una funzione di fabbrica. Crea un oggetto generico, assegna ad esso le proprietà e quindi restituisce l'oggetto.
  2. Può essere ereditato da, ma non in modo classico, solo da un'altra funzione di fabbrica che sa come funziona questo oggetto. Alcuni tipi di ereditarietà di mixin non sono fattibili con questa struttura.
  3. Non funziona con instanceof.
  4. Non utilizza e non può utilizzare il prototipo per i metodi.
  5. Potrebbe essere chiamato con new e funzionerebbe ancora (il nuovo oggetto creato dal sistema verrebbe semplicemente scartato).
  6. Può creare qualsiasi tipo di oggetto. Può anche diramarsi in base agli argomenti passati o all'ambiente e creare un diverso tipo di oggetto basato su una logica. Tecnicamente puoi farlo anche con il primo stile, ma è inefficiente perché l'interprete crea un tipo specifico di oggetto e poi restituirai qualcos'altro che causerebbe la garbage collection dell'oggetto originale che è stato creato. Quindi, se creerai più tipi diversi di oggetti, il secondo metodo sarebbe più efficiente.

Al di fuori di queste differenze, i due funzioneranno principalmente allo stesso modo e non c'è nulla di tecnicamente "sbagliato" con entrambi i metodi.

Ci sono sostenitori di entrambi gli stili di programmazione in Javascript e alcuni direbbero che ci sono situazioni in cui uno è più appropriato di un altro e viceversa. Ti suggerisco di creare un paio di sottoclassi per questo oggetto per eliminare alcune delle differenze di programmazione perché anche le sottoclassi funzioneranno diversamente.


Se si desidera cercare altri articoli sul tema, questo è fondamentalmente una "funzione di costruzione rispetto a una funzione di fabbrica in Javascript", che a volte allontanarsi in argomento per/contro l'uso del .prototype, ma anche tende a coprire anche il tuo argomento.

Ecco alcuni articoli su questo argomento specifico (che coprono una gamma di opinioni):

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