JavaScript: funzione che restituisce un oggetto


90

Sto prendendo alcune lezioni JavaScript / jQuery su codecademy.com. Normalmente le lezioni forniscono risposte o suggerimenti, ma per questa non aiuta e sono un po 'confuso dalle istruzioni.

Dice di fare in modo che la funzione makeGamePlayer restituisca un oggetto con tre chiavi.

//First, the object creator
function makeGamePlayer(name,totalScore,gamesPlayed) {
    //should return an object with three keys:
    // name
    // totalScore
    // gamesPlayed
}

Non sono sicuro di doverlo fare

//First, the object creator
function makeGamePlayer(name,totalScore,gamesPlayed) {
    //should return an object with three keys:
    // name
    // totalScore
    // gamesPlayed

         this.name =  name;
         this.totalScore = totalScore;
         this.gamesPlayed = gamesPlayed;
}

o qualcosa del genere

 //First, the object creator
    function makeGamePlayer(name,totalScore,gamesPlayed) {
        //should return an object with three keys:
        // name
        // totalScore
        // gamesPlayed

         var obj = {
             this.name =  name;
             this.totalScore = totalScore;
             this.gamesPlayed = gamesPlayed;
          }
    }

Devo essere in grado di modificare le proprietà dell'oggetto dopo la sua creazione.

Risposte:


145

In JavaScript, la maggior parte delle funzioni è sia richiamabile che istanziabile: hanno sia metodi interni [[Call]] e [[Construct]] .

Come oggetti richiamabili, puoi usare le parentesi per chiamarli, opzionalmente passando alcuni argomenti. Come risultato della chiamata, la funzione può restituire un valore .

var player = makeGamePlayer("John Smith", 15, 3);

Il codice sopra chiama la funzione makeGamePlayere memorizza il valore restituito nella variabile player. In questo caso, potresti voler definire la funzione in questo modo:

function makeGamePlayer(name, totalScore, gamesPlayed) {
  // Define desired object
  var obj = {
    name:  name,
    totalScore: totalScore,
    gamesPlayed: gamesPlayed
  };
  // Return it
  return obj;
}

Inoltre, quando chiami una funzione stai anche passando un argomento aggiuntivo sotto il cofano, che determina il valore di thisall'interno della funzione. Nel caso precedente, poiché makeGamePlayernon viene chiamato come metodo, il thisvalore sarà l'oggetto globale in modalità sciatta o indefinito in modalità rigorosa.

Come costruttori, puoi utilizzare l' newoperatore per istanziarli. Questo operatore utilizza il metodo interno [[Construct]] (disponibile solo nei costruttori), che fa qualcosa di simile:

  1. Crea un nuovo oggetto che eredita dal .prototypedel costruttore
  2. Chiama il costruttore passando questo oggetto come thisvalore
  3. Restituisce il valore restituito dal costruttore se si tratta di un oggetto o altrimenti l'oggetto creato al passaggio 1.
var player = new GamePlayer("John Smith", 15, 3);

Il codice precedente crea un'istanza di GamePlayere memorizza il valore restituito nella variabile player. In questo caso, potresti voler definire la funzione in questo modo:

function GamePlayer(name,totalScore,gamesPlayed) {
  // `this` is the instance which is currently being created
  this.name =  name;
  this.totalScore = totalScore;
  this.gamesPlayed = gamesPlayed;
  // No need to return, but you can use `return this;` if you want
}

Per convenzione, i nomi dei costruttori iniziano con una lettera maiuscola.

Il vantaggio dell'utilizzo dei costruttori è che le istanze ereditano da GamePlayer.prototype. Quindi, puoi definire le proprietà lì e renderle disponibili in tutti i casi


4
@OP anche notare che quando si sta per invocarlo con la newparola chiave vorrei suggerire di iniziare il nome con la A maiuscola: MakeGamePlayer.
PeeHaa

3
@PeeHaa Un buon consiglio, sarebbe anche la convenzione di denominazione più tipica quando si utilizza il costruttore new GamePlayer().
Matt Zeunert

@ RobG Grazie, è quello che succede quando copio e incollo il codice senza guardarlo a fondo.
Oriol

48

Puoi semplicemente farlo in questo modo con un oggetto letterale :

function makeGamePlayer(name,totalScore,gamesPlayed) {
    return {
        name: name,
        totalscore: totalScore,
        gamesPlayed: gamesPlayed
    };
}

3
ciao, come puoi accedere alle proprietà di ritorno, quando uso makeGamePlayer.name non funziona
iKamy

1
var player1 = makeGamePlayer ("Bobby Fischer", 15, 5); player1.name;
mrturtle

5

Entrambi gli stili, con un tocco di ritocco, funzionerebbero.

Il primo metodo utilizza un costruttore Javascript, che come la maggior parte delle cose ha pro e contro.

 // By convention, constructors start with an upper case letter
function MakePerson(name,age) {
  // The magic variable 'this' is set by the Javascript engine and points to a newly created object that is ours.
  this.name = name;
  this.age = age;
  this.occupation = "Hobo";
}
var jeremy = new MakePerson("Jeremy", 800);

D'altra parte, l'altro tuo metodo è chiamato "Revealing Closure Pattern" se ricordo bene.

function makePerson(name2, age2) {
  var name = name2;
  var age = age2;

  return {
    name: name,
    age: age
  };
}

Si chiama "modello di modulo rivelatore" Ma di solito è racchiuso in una chiusura privata (function () {return {}}) ()
Felipe Quirós

3

L'ultimo modo per farlo con ES2016 JavaScript

let makeGamePlayer = (name, totalScore, gamesPlayed) => ({
    name,
    totalScore,
    gamesPlayed
})

2

Direi che queste indicazioni significherebbero:

  function makeGamePlayer(name,totalScore,gamesPlayed) {
        //should return an object with three keys:
        // name
        // totalScore
        // gamesPlayed

         var obj = {  //note you don't use = in an object definition
             "name": name,
             "totalScore": totalScore,
             "gamesPlayed": gamesPlayed
          }
         return obj;
    }

1
Perché hai il punto e virgola all'interno dell'oggetto?
Alex G

@AlexG bella presa, non posso credere che nessun altro l'abbia fatto nei 4 anni da quando ho pubblicato questa risposta per la prima volta. È stato senza dubbio un pessimo lavoro di copia e incolla dell'oggetto originale dell'OP che io e sembra che abbiamo fatto pochi altri.
scrappedcola
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.