【问题标题】:Modifying object properties with a method使用方法修改对象属性
【发布时间】:2015-04-17 15:34:46
【问题描述】:

所以我正在尝试编写一个简单的游戏来处理对象并习惯于操纵和使用它们。我想做的是设置基本统计信息(用户/程序员定义),然后在方法中使用这些基本统计信息来创建复杂的统计信息。我正在尝试做的示例代码:

var main = function() {
   function Boss (name, lvl, str, dex, int) {
      this.bName = name
      this.level = lvl
      this.strength = str
      this.dexterity = dex
      this.intelligence = int
      this.pAttack  = pAttack();
    }
     function pAttack() {
       (2*this.level) + (2*this.strength);
     }
      var a1Boss = new Boss("test", 50, 500, 500, 500)
      console.log(a1Boss.pAttack)
    }  

这将 undefined 返回到控制台,尽管其他一切都正确返回。是否应将 pAttack 函数设置为 var pAttack = function() {code}

任何帮助将不胜感激

【问题讨论】:

  • 你没有返回一个值,所以undefined是可以预期的。
  • pAttack 函数的末尾应该有return pAttack 行吗?
  • 只有你想要一个,但我看不出有什么好的理由。

标签: javascript object methods


【解决方案1】:

如果您希望将方法附加到新对象,请执行以下操作:

this.pAttack = pAttack;
// and the function should be initialized as a variable
var pAttack = function(){...};

如果您希望将您的方法附加到原型:

Boss.prototype.pAttack = pAttack;

【讨论】:

  • 所以,我将其更改为:var pAttack = function () { return (2*this.lvl) + (2*this.str); } 现在将“function main/pAttack()”记录到控制台
【解决方案2】:

很多语法错误。

function Boss (name, lvl, str, dex, int) {
    this.bName = name;
    this.level = lvl;
    this.strength = str;
    this.dexterity = dex;
    this.intelligence = int;
    this.pAttack  = this.pAttack();
}
Boss.prototype = {
    pAttack: function () {
        return (2*this.level) + (2*this.strength); 
    },
    pDefend: function () {
        //Defend stuff
    },
    levelUp: function () {
        this.level = this.level + 1;
    }
};

var a1Boss = new Boss("test", 50, 500, 500, 500);
console.log(a1Boss.pAttack)

https://jsfiddle.net/sLhrek8h/1/

【讨论】:

  • 代码实际上并没有抛出SyntaxError,所以没有任何语法错误。不过确实有很多不好的语法。
  • 感谢您的帮助 andybeli,此解决方案对我有用。抱歉,这里的格式草率,我在实际编写代码时使用了 IDE,因此将其输入普通文本格式时有些草率。另一个问题,是否可以在同一个括号内将多个函数分配为原型?类似:Obj.prototype = { var1: function () {...} var2: function () {...} var3: function () {...} }
  • 是的,你可以。我只是用一些例子来编辑答案。不要忘记每个逗号后面的逗号,最后一个除外。
  • 感谢您的示例。在我必须真正回去工作之前的最后一个问题。在 levelUp 函数上,是否只是从另一个函数(xp 到达 nextLevel 时触发的事件)调用,例如 if (a1Boss.currentExp >= nextLevel) { return a1Boss.levelUp(); }
  • 是的,这将是一个不错的选择。请你也给我的答案投票。
【解决方案3】:

您实际上执行了方法pAttack 而不是分配它。由于pAttack 不返回任何内容,因此undefined 作为替代返回。

所以不要执行它,

this.pAttack  = pAttack;

或者返回一些东西

function pAttack() {
    return (2*this.level) + (2*this.strength);
}

【讨论】:

    【解决方案4】:

    您的函数需要返回一个值。但是,我会将它创建为对象的方法,然后这样调用它:

    var main = function() {
        function Boss(name, lvl, str, dex, int) {
            this.bName = name;
            this.level = lvl;
            this.strength = str;
            this.dexterity = dex;
            this.intelligence = int;
            this.pAttack = function() {
                return (2 * this.level) + (2 * this.strength);
            }
        }
        var a1Boss = new Boss("test", 50, 500, 500, 500);
        console.log(a1Boss.pAttack());
    };
    
    main(); // outputs '1100' to the console
    

    【讨论】:

    • 谢谢,这也可以。我将使用此页面上为我提供的其他方法将 pAttack 函数设置为 Boss 类的原型,因为我将有多个 Boss,并且拥有所有计算攻击的方程式会更容易阅读/防御/等在一处。
    【解决方案5】:

    从长远来看,另一个可能会有所帮助的解决方案是将参数传递到函数中,然后返回该值。

    function pAttack(level, strength) {
       return (2*level) + (2*strength);
    }
    

    并用

    调用它
    this.pAttack = pAttack(this.level, this.strength); 
    

    【讨论】:

      【解决方案6】:

      目前pAttack 没有在Boss 实例的上下文中调用,所以this 没有指向您所期望的,您有3 个选项

      在所有情况下,不要忘记从pAttack 函数中输入return


      选项1,让实例继承pAttack

      定义pAttack后,添加以下内容

      Boss.prototype.pAttackFn = pAttack;
      

      这是做什么的?
      它使Boss 的所有实例,即new Boss 构造的对象,继承函数pAttack 作为属性pAttackFn,因此您可以调用它,例如

      this.pAttack = this.pAttackFn();
      

      选项2,使用.call.apply定义调用上下文

      this.pAttack  = pAttack.call(this);
      

      选项3,给pAttack参数而不是依赖this

      function pAttack(lvl, str) {
          return (2 * lvl) + (2 * str);
      }
      

      然后

      this.pAttack  = pAttack(this.level, this.strength);
      

      【讨论】:

        猜你喜欢
        • 2021-06-16
        • 2019-05-06
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        相关资源
        最近更新 更多