JavaScript: функция, возвращающая объект
Я делаю несколько уроков JavaScript/jQuery на codecademy.com. Обычно уроки дают ответы или подсказки, но для этого он не дает никакой помощи, и я немного смущен инструкциями.
В нем говорится, что функция 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;
}
}
Я должен иметь возможность изменять свойства объекта после его создания.
Ответы
Ответ 1
В JavaScript большинство функций являются вызываемыми и реалистичными: у них есть как [[Call]] и [[Construct]] внутренние методы.
В качестве вызываемых объектов вы можете использовать круглые скобки для их вызова, опционально передавая некоторые аргументы. В результате вызова функция может вернуть значение.
var player = makeGamePlayer("John Smith", 15, 3);
Вышеупомянутый код вызывает функцию makeGamePlayer
и сохраняет возвращаемое значение в переменной player
. В этом случае вы можете определить функцию следующим образом:
function makeGamePlayer(name, totalScore, gamesPlayed) {
// Define desired object
var obj = {
name: name,
totalScore: totalScore,
gamesPlayed: gamesPlayed
};
// Return it
return obj;
}
Кроме того, при вызове функции вы также передаете дополнительный аргумент под капотом, который определяет значение this
внутри функции. В приведенном выше случае, поскольку makeGamePlayer
не вызывается как метод, значение this
будет глобальным объектом в неактивном режиме или undefined в строгом режиме.
В качестве конструкторов вы можете использовать оператор new
для их создания. Этот оператор использует внутренний метод [[Construct]] (доступен только в конструкторах), который делает что-то вроде этого:
- Создает новый объект, который наследует от
.prototype
конструктора
- Вызывает конструктор, передающий этот объект как значение
this
- Возвращает значение, возвращаемое конструктором, если это объект или объект, созданный на шаге 1 в противном случае.
var player = new GamePlayer("John Smith", 15, 3);
Приведенный выше код создает экземпляр GamePlayer
и сохраняет возвращаемое значение в переменной player
. В этом случае вы можете определить функцию следующим образом:
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
}
По соглашению имена конструкторов начинаются с прописной буквы.
Преимущество использования конструкторов в том, что экземпляры наследуют от GamePlayer.prototype
. Затем вы можете определить свойства там и сделать их доступными во всех экземплярах
Ответ 2
Вы можете просто сделать это с помощью литерала объекта:
function makeGamePlayer(name,totalScore,gamesPlayed) {
return {
name: name,
totalscore: totalScore,
gamesPlayed: gamesPlayed
};
}
Ответ 3
Оба стиля, с легкой настройкой, будут работать.
В первом методе используется Javascript Constructor, который, как и большинство вещей, имеет свои плюсы и минусы.
// 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);
С другой стороны, ваш другой метод называется "Revealing Closure Pattern", если я правильно помню.
function makePerson(name2, age2) {
var name = name2;
var age = age2;
return {
name: name,
age: age
};
}
Ответ 4
Я бы назвал эти указания:
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;
}
Ответ 5
Самый последний способ сделать это с ES2016 JavaScript
let makeGamePlayer = (name, totalScore, gamesPlayed) => ({
name,
totalScore,
gamesPlayed
})
Ответ 6
const upadteAgeAndCount = async (id,age) => {
const user = await User.findByIdAndUpdate(id,{age},{new:true})
const count = await User.countDocuments({age})
return ({user,count})
}