【问题标题】:JavaScript: function returning an objectJavaScript:函数返回一个对象
【发布时间】:2019-07-15 23:31:51
【问题描述】:

我正在 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;
          }
    }

我必须能够在创建对象后修改其属性。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    在 JavaScript 中,大多数 functions 既可调用又可实例化:它们同时具有 [[Call]][[Construct]] 内部方法。

    作为可调用对象,您可以使用括号来调用它们,也可以选择传递一些参数。作为调用的结果,函数可以return a value

    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 operator 来实例化它们。该运算符使用[[Construct]] 内部方法(仅在构造函数中可用),它执行如下操作:

    1. 创建一个继承自构造函数的.prototype 的新对象
    2. 调用构造函数将该对象作为this 值传递
    3. 如果是对象,则返回构造函数返回的值,否则返回第 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。然后,您可以在那里定义属性并使其在所有实例中可用

    【讨论】:

    • @OP 还请注意,当您要使用 new 关键字调用它时,我建议以大写字母开头:MakeGamePlayer
    • @PeeHaa 好建议,使用构造函数时更典型的命名约定是new GamePlayer()
    • @RobG 谢谢,当我复制粘贴代码而不深入研究时,就会发生这种情况。
    【解决方案2】:

    您可以简单地使用object literal

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

    【讨论】:

    • 你好,你如何访问返回属性,当我使用 makeGamePlayer.name 时它不起作用
    • var player1 = makeGamePlayer("Bobby Fischer", 15, 5); player1.name;
    【解决方案3】:

    使用 ES2016 JavaScript 的最新方法

    let makeGamePlayer = (name, totalScore, gamesPlayed) => ({
        name,
        totalScore,
        gamesPlayed
    })
    

    【讨论】:

      【解决方案4】:

      这两种风格,只要稍加调整,都可以工作。

      第一种方法使用 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(){return{}})()
      【解决方案5】:

      我认为这些指示的意思是:

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

      【讨论】:

      • 为什么对象里面有分号?
      • @AlexG 不错,不敢相信自从我第一次发布这个答案以来的 4 年里没有人做过。这无疑是我和其他人制作的 OP 原始对象的糟糕剪切粘贴工作。
      猜你喜欢
      • 2012-07-17
      • 1970-01-01
      • 2014-05-22
      • 2017-12-05
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      相关资源
      最近更新 更多