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]]内部方法(只在构造函数中可用),这样做是这样的:
- 创build一个从构造函数的
.prototype
inheritance的新对象 - 调用传递这个对象的构造函数作为
this
值 - 如果它是一个对象,则返回构造函数返回的值,否则返回步骤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; }