JavaScript:函数返回一个对象

我在codecademy.com上学习了一些JavaScript / jQuery课程。 通常情况下,这些课程提供了答案或提示,但是对于这个课程并没有提供任何帮助,而且我对指令有些困惑。

它说使makeGamePlayer函数返回一个带有三个键的对象。

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

我不确定我是否应该这样做

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

或者类似的东西

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

我必须能够修改对象创build后的属性。

在JavaScript中,大多数函数都是可调用的和可实例化的:它们同时具有[[Call]]和[[Construct]]内部方法。

作为可调用对象,可以使用括号来调用它们,可以传递一些参数。 作为调用的结果,该函数可以返回一个值 。

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

上面的代码调用函数makeGamePlayer并将返回的值存储在variablesplayer 。 在这种情况下,您可能想要像这样定义函数:

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

另外,当你调用一个函数的时候,你还会传递一个额外的参数,它决定了函数内部的值。 在上面的例子中,由于makeGamePlayer没有作为一个方法被调用,所以this值将是马虎模式下的全局对象,或者在严格模式下是未定义的。

作为构造函数,可以使用new运算符来实例化它们。 这个操作符使用[[Construct]]内部方法(只在构造函数中可用),这样做是这样的:

  1. 创build一个从构造函数的.prototypeinheritance的新对象
  2. 调用传递这个对象的构造函数作为this
  3. 如果它是一个对象,则返回构造函数返回的值,否则返回步骤1创build的对象。
 var player = new GamePlayer("John Smith", 15, 3); 

上面的代码创build一个GamePlayer的实例, GamePlayer返回的值存储在variablesplayer 。 在这种情况下,您可能想要像这样定义函数:

 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 } 

按照惯例,构造函数名称以大写字母开头。

使用构造函数的优点是实例inheritance自GamePlayer.prototype 。 然后,您可以在那里定义属性,并使其在所有实例中都可用

你可以简单地用对象文字来做这件事:

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

这两种风格,只要稍微调整一下,都可以奏效。

第一种方法使用Javascript构造函数,它像大多数事物一样有优点和缺点。

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

另一方面,如果我记得正确的话,你的另一种方法被称为“揭示封闭模式”。

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

我会采取这些方向意味着:

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