2012-09-04 19 views
52

estoy tomando algunas clases de JavaScript/jQuery en codecademy.com. Normalmente, las lecciones proporcionan respuestas o pistas, pero para esta no da ninguna ayuda y estoy un poco confundido por las instrucciones.JavaScript: función que devuelve un objeto

Se dice que hacer la función makeGamePlayer devolver un objeto con tres teclas.

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

No estoy seguro de si debería estar haciendo esto

//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 algo así

//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; 
      } 
    } 

Tengo que ser capaz de modificar las propiedades del objeto después de su creado.

Respuesta

84

En JavaScript, la mayoría son functions tanto exigible y instanciable: Las dos presentan una [[Call]] y [[Construct]] métodos internos.

objetos Como se puede llamar, se pueden utilizar paréntesis para llamar a ellos, opcionalmente puede pasar algunos argumentos. Como resultado de la llamada, la función puede return a value.

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

El código anterior llamadas a funciones makeGamePlayer y almacena el valor devuelto en la variable player. En este caso, es posible que desee para definir la función como esta:

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

Además, cuando se llama a una función que también está pasando un argumento adicional bajo el capó, el cual determina el valor de this dentro de la función. En el caso anterior, dado que makeGamePlayer no se llama como método, el valor this será el objeto global en modo descuidado o indefinido en modo estricto.

Como constructores, puede utilizar la new operator para crear instancias de ellos. Este operador utiliza el método [[Construct]] interna (sólo disponible en los constructores), que hace algo como esto:

  1. Crea un nuevo objeto que hereda de la .prototype del constructor
  2. llama al constructor de pasar este objeto como el this valor
  3. se devuelve el valor devuelto por el constructor si es un objeto, o el objeto creado en el paso 1 de otra manera.
var player = new GamePlayer("John Smith", 15, 3); 

El código anterior crea una instancia de GamePlayer y almacena el valor devuelto en la variable player. En este caso, es posible que desee para definir la función como esta:

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 
} 

Por convención, los nombres de constructores comienzan con una letra mayúscula.

La ventaja de utilizar constructores es que las instancias heredan de GamePlayer.prototype. A continuación, puede definir propiedades allí y ponerlos a disposición en todos los casos

+3

@OP también tenga en cuenta que cuando vaya a invocarlo con la palabra clave 'new' sugeriría comenzar el nombre con una letra mayúscula:' MakeGamePlayer'. – PeeHaa

+2

@ Oriol: comprueba el objeto literal, tiene errores de sintaxis. – RobG

+3

@PeeHaa Un buen consejo, también la convención de nomenclatura más típica cuando se usa el constructor sería 'nuevo GamePlayer()'. –

29

sólo tiene que hacerlo de esta manera con un object literal:

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

me gustaría tener esas direcciones en el sentido de:

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

¿Por qué tiene punto y coma dentro del objeto? –

+0

@AlexG buena captura, no puedo creer que nadie más lo hizo en los 4 años desde que publiqué esta respuesta por primera vez. Sin duda, fue un mal trabajo de cortar y pegar del objeto original de OP que yo y parece que hicieron otros pocos. – scrappedcola

2

Ambos estilos, con un toque de ajustar, funcionaría.

El primer método utiliza un Constructor de Javascript, que como la mayoría de las cosas tiene ventajas y desventajas.

// 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); 

Por otro lado, el otro método es el llamado 'Revelación del patrón de cierre' si no recuerdo mal.

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

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

Creo que olvidó una nueva antes de la llamada 'MakePerson' en su primer ejemplo de código. –

+0

@Mat - Así lo hice. Adicional. Gracias. –

Cuestiones relacionadas