首页 > 解决方案 > 我可以创建两个包含不同方法的对象实例吗

问题描述

如果构造函数中的方法对于所有实例都相同,我完全理解 JavaScript 中原型继承的概念。但是,如果我想通过构造函数创建对象但希望方法为每个实例产生不同的结果怎么办?

   function Player (health, power, stamina) { 
       this.health = health;
       this.power = power;
       this.stamina = stamina;
       this.recovery = function () {
        
       return this.health += 20;

       }
   }

    var hulk = new Person ( 100,80,60 );
    var superman = new Person ( 100,70,50);

我的问题是,当我调用恢复方法时,我希望 hulks 恢复添加 20,但我希望超人添加 40。如果我将方法添加到原型而不是直接添加到对象中,我仍然希望该方法仅适用于 hulk和一个不同的超人。我是否为此创建对象文字并为每个对象指定不同的方法?如果我有数百个字符,这似乎很长!或者我是否要向 Person 原型添加另一个多个方法,即使它只会被一个实例使用?在仍然使用构造函数的同时,使超人的恢复比绿​​巨人更好的最佳方法是什么?谢谢大家。

标签: javascriptobjectinheritanceconstructorprototype

解决方案


将第 4 个参数传递给Player,该参数表示健康恢复:

function Player(health, power, stamina, healthRegen) {
   this.health = health;
   this.power = power;
   this.stamina = stamina;
   this.healthRegen = healthRegen;
   this.recovery = function() {
     return this.health += this.healthRegen;
   }
}
var hulk = new Person(100, 80, 60, 20);
var superman = new Person(100, 70, 50, 40);

如果大多数角色都有特定数量的生命恢复(比如 20),而您只希望superman和其他几个角色拥有不同的生命恢复,则可以使用默认参数来避免写这么多20

function Player(health, power, stamina, healthRegen = 20) {
   this.health = health;
   this.power = power;
   this.stamina = stamina;
   this.healthRegen = healthRegen;
   this.recovery = function() {
     return this.health += this.healthRegen;
   }
}
var hulk = new Person(100, 80, 60);
var superman = new Person(100, 70, 50, 40);
var normalPerson = new Person(50, 50 50);

上图,当所需的生命恢复值不是 20时,只需要传递第 4 个参数即可;否则,它将默认为 20。


推荐阅读