使用方法修改对象属性

时间:2015-04-17 15:34:47

标签: javascript object methods

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

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}

任何帮助将不胜感激

6 个答案:

答案 0 :(得分:1)

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

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

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

Boss.prototype.pAttack = pAttack;

答案 1 :(得分:0)

目前pAttack实例的上下文中未调用Boss,因此this未指向您的预期,您有3个选项

在所有情况下,请勿忘记return功能中的pAttack


选项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);

答案 2 :(得分:0)

您的函数需要返回一个值。我会将它创建为对象的方法,然后将其称为:

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

答案 3 :(得分:0)

很多语法错误。

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/

答案 4 :(得分:0)

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

所以不要执行它,

this.pAttack  = pAttack;

或返回一些东西

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

答案 5 :(得分:0)

根据你从长远来看做的事情可能会有所帮助的另一个解决方案是将参数传递给你的函数,并返回该值。

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

并用

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