2012-12-25 15 views
9

Eventuali duplicati:
Self-references in object literal declarationsCome fare riferimento a proprietà dell'oggetto corrente in JS

Ho alcuni semplici oggetti in JS come in questo esempio:

var object = { 
firstname : 'john', 
lastname : 'paul', 
wholename : firstname + lastname 
} 

Ebbene questo la cosa semplice non funziona; john e paul sono indefiniti in wholename, quindi ho provato a usare l'operatore "this" che funziona SOLO se faccio una funzione (getWholeName(){return this.firstname+this.lastname}). Ma se voglio usare una variabile e non una funzione, come posso fare? Ho anche provato object.firstname + object.lastname ma non funziona.

risposta

11

Non v'è alcun modo per fare riferimento all'oggetto, ma è possibile aggiungere le proprietà in modo dinamico:

var object = { 
    firstname : 'john', 
    lastname : 'paul' 
}; 

object.wholename = object.firstname + object.lastname; 

EDIT:

E perché non avvolgerlo in una funzione?

var makePerson = function (firstname, lastname) { 
    return { 
     firstname: firstname, 
     lastname: lastname, 
     wholename: firstname + lastname // refers to the parameters 
    }; 
}; 

var object = makePerson('john', 'paul'); 
+0

Ok, grazie. Il motivo per cui sto facendo questo è che sto cercando di avere un codice ben organizzato in un'enorme app web che sto costruendo; e così ho deciso di raggruppare funzioni e variabili simili in oggetti come questo. È questo il modo giusto per farlo? So di TypeScript e Moduli, ma devo usare TS per ottenere qualcosa di semplice come gruppi di funzioni/variabili? – Rayjax

+2

@ user1397271 puoi farlo in semplice JS: prova a introdurre spazi dei nomi (come var MYAPP = {}; MYAPP.data = ...) e prova a scomporre le grandi funzioni in quelle più piccole. Prendi in considerazione l'utilizzo del modello di modulo: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth – Stefan

+0

quando dici namespace come var MYAPP = {}, significa che è uguale al mio esempio con var object = {}, quindi mi imbatterò nel problema che stavo chiedendo? – Rayjax

2

In Javascript, ogni funzione è un oggetto. Si dovrebbe dichiarare il costruttore del oggetto come una funzione come questa:

function person(firstname,lastname) 
{ 
this.firstname=firstname; 
this.lastname=lastname; 

this.wholeName=wholeName; 

//this will work but is not recommended. 
function wholeName() 
{ 
return this.firstname+this.lastname; 
} 
} 

è possibile aggiungere i metodi extra per il vostro oggetto con la prototipazione che entrava, che è il modo consigliato di fare le cose. Maggiori informazioni qui:

http://www.javascriptkit.com/javatutors/proto.shtml

+0

se tutto è una funzione ... cosa è questo => 'var obj = {1: 1,2: 2}'? – charlietfl

+0

Hai ragione, ma ogni funzione è comunque un oggetto. Ecco cosa intendevo. Sono corretto :) – user1574041

+0

Hai appena rimosso questo w3schools o qualche altro sito web? – 0x499602D2

Problemi correlati