2013-08-06 17 views
8

Sono nuovo agli oggetti in javascript. Leggi su questo argomento su https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript e ti sei un po 'confuso.Definizione dell'oggetto in 2 modi: qual è la differenza?

Non capisco la differenza tra funzioni e oggetti. Da un lato, si suppone che la funzione sia l'istanza di Function (che è un figlio di Object) e quindi si suppone che anche una funzione sia un Object.

D'altro oggetto mano stessa è indicata come una coppia valore-chiave, come ad esempio:

  1. var User = {name:"Tomy", password:"secret"}

    e questo è molto diversa da una definizione di funzione in termini di compatibilità codice ..

    Posso creare una funzione in due modi diversi?

  2. var User = function() {this.name="Tomy"; this.password="secret";}

+2

Con B u può fare 'var Tomy = new User();' – DarkBee

+2

e oggetto è una struttura dati per contenere ... dati. Una funzione è una raccolta riutilizzabile di comandi. Puoi usare una funzione come * funzione costruttore * per * creare * un oggetto. Un oggetto letterale e una funzione di costruzione sono due modi per creare oggetti, solo che devi * esplicitamente * chiamare * la funzione di costruzione per creare l'oggetto. –

+0

@DarkBee Più precisamente, la versione B ha un prototipo (set di proprietà clonate su ogni nuova istanza) mentre A no. EDIT: mi fa pensare, puoi usare new con A se aggiungi una proprietà prototype all'oggetto anonimo? – Virus721

risposta

7

In questo esempio, User ora contiene un oggetto.

var User = {name:"Tomy", password:"secret"} 
typeof User === "object" 
User.name === "Tomy" 

In questo esempio, User terrà una funzione. Questa funzione può essere utilizzata per creare oggetti.

var User = function() {this.name="Tomy"; this.password="secret";} 
typeof User === "function" 
User.name === undefined 

Si potrebbe quindi creare il numero di utenti che si desidera.

var user1 = new User(), user2 = new User(); 
user1.name === "Tomy" 

Un esempio più realistico, sarebbe questo:

var User = function (name, pass) {this.name=name; this.password=pass;} 

var john = new User("John", "secret") 
var andrew = new User("Andrew", "passw0rd") 

john.password === "secret" 

Generalmente costruttori (funzioni che rendono gli oggetti) sono più flessibili rispetto letterali oggetto, e permettere la creazione comodo e coerente di oggetti (i bug sono più facili da individuare, meno codice duplicato).

Non ci sono incoerenze cross-browser nei due metodi.


Per capire ciò che il new keyword è e ciò che accade in modo efficace al "momento della creazione", vedi What is the 'new' keyword in JavaScript? e How does the new operator work in JavaScript?

+0

ok, un'ultima domanda riguardante il "momento della creazione" di un oggetto ;-). quando faccio var john = new User ("John", "secret"), allora cosa succede esattamente? La mia ipotesi è questa: 1) viene creato un nuovo oggetto. 2) questo è legato a quell'oggetto appena creato. 3) viene chiamata la funzione. (e così crea i membri dati quando chiama this.qualcosa). Ho capito bene? – Novellizator

+0

@Novellizator, ho aggiunto una spiegazione alla fine della mia risposta. – FakeRainBrigand

+0

@FakeRainBrigand: No, non viene copiato nulla. E il nuovo oggetto non è equivalente a '{}' (a meno che 'User.prototype' sia' null'). Fare riferimento a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new per i passaggi corretti. – Bergi

2

Il primo crea un'istanza di un oggetto con due proprietà. È possibile accedere in questo modo:

User.name; // Tomy 
User.password; // secret 

Il secondo crea una definizione di un oggetto che è possibile creare istanze separate di e avranno istanze separate di loro proprietà. Esempio:

var a = new User(); 
a.name; // Tomy 
a.password; // secret 
var b = new User(); 
b.name = "Ralph"; 
a.name; // Tomy 
b.name; // Ralph 
1

I due non sono lontanamente equivalenti. La prima versione crea un oggetto con le proprietà name e password impostata. La seconda versione crea una funzione che non è stata eseguita; non ci sono proprietà impostate fino a quando non viene richiamato new User.

Problemi correlati