Подтвердить что ты не робот

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

Я должен иметь возможность изменять свойства объекта после его создания.

4b9b3361

Ответ 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})
}