【问题标题】:Can I create two object instances that contain different methods我可以创建两个包含不同方法的对象实例吗
【发布时间】:2020-12-17 17:21:30
【问题描述】:

如果构造函数中的方法对所有实例都相同,我完全理解 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。如果我将方法添加到原型而不是直接添加到对象中,我仍然希望该方法仅绿巨人和超人不同。我是否为此创建对象文字并为每个对象指定不同的方法?如果我有数百个字符,这似乎很长!或者我是否应该向 Person 原型添加另一个多个方法,即使它只被一个实例使用?在仍然使用构造函数的情况下,让超人恢复得比绿巨人更好的最好方法是什么?谢谢大家。

【问题讨论】:

    标签: javascript object inheritance constructor prototype


    【解决方案1】:

    将第 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);
    

    上面,看看当期望的生命恢复other不是20时,你只需要传递第4个参数;否则,它将默认为 20。

    【讨论】:

    • 虽然我有你在这里,伙计。如果我希望某些方法对某些实例可用而对其他实例不可用怎么办?我将如何处理呢?再次感谢
    • 取决于方法的类型。您可以创建一个扩展父类的子类,或者您可以将另一个布尔参数传递给构造函数(就像上面使用 healthRegen 所做的那样),以检查该方法是否可以在该对象上运行..
    • 我可以在构造函数中创建方法并且只在我想使用它的实例上调用它们吗?但这似乎不对?
    • 我会将方法放在原型上,并检查是否允许实例在该方法中调用该方法。 sing() { if (this.canSing) { console.log(this.name + ' is singing'); }}
    • 将布尔值分配给构造函数中实例的属性。 constructor(canSing = false) { this.canSing = canSing; } 然后在调用方法时检查该属性。 (如果需要,如果不允许,则抛出错误。)或者只在子类上定义属性,例如class PlayerWhoSings {
    猜你喜欢
    • 2015-07-02
    • 2012-04-22
    • 2011-07-24
    • 2016-02-01
    • 1970-01-01
    • 2016-09-19
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多