【问题标题】:How to create a constructor function?如何创建构造函数?
【发布时间】:2016-07-23 19:45:48
【问题描述】:

问题:我正在尝试创建一个名为 Wizard 的构造函数,它接受 2 个参数:名称和拼写,然后创建一个 Wizard 对象:

“每个特定的向导实例都必须有一个名称属性(一个字符串)、一个字符串数组的法术属性和一个能够以字符串格式返回随机法术的 castSpell 方法。”

该对象具有以下属性:name 是“Gorrok”(字符串),spells 是“abracadabra”和“cadabraabra”(数组)。

目标:调用 castSpell 方法来显示一个随机法术,如下所示: Gorrok : abracadabra

代码:目前我只写了以下代码,卡在这个阶段!

function Wizard(name, spells){
    this.name = name;
    this.spells = [spells];
    this.castSpell = function(){
        var v = Math.random();
        if (v >= 1)
            document.write(this.name + " :  " + this.spells[0]);
        else
            document.write(this.name + " :  " + this.spells[1]);
    }
}
var w = new Wizard("Gorrok", "abracadabra", "cadabraabra");
w.castSpell();

【问题讨论】:

    标签: javascript function object


    【解决方案1】:

    所以,Math.random() 将返回一个介于 0 和 1 之间的数字,因此它永远不会大于 1。

    此外,您不能按照您的方式将剩余的参数转换为数组。

    最简单的修复:

    function Wizard(name, spells){
        this.name = name;
        this.spells = spells; // assume spells is already an array
        this.castSpell = function(){
            var v = Math.random();
            if (v >= 0.5)
                document.write(this.name + " :  " + this.spells[0]);
            else
                document.write(this.name + " :  " + this.spells[1]);
        }
    }
    var w = new Wizard("Gorrok", ["abracadabra", "cadabraabra"]);
    w.castSpell(); 
    

    【讨论】:

      【解决方案2】:

      我认为保罗的回答是正确的。此外,对于不在 ctor 中的函数,请使用原型。原型还允许您添加未在构造函数中定义的成员变量。

      这是 w3 中的一个示例:

      function Person(first, last, age, eyecolor) {
          this.firstName = first;
          this.lastName = last;
          this.age = age;
          this.eyeColor = eyecolor;
      }
      Person.prototype.nationality = "English";
      

      【讨论】:

      • 值得指出的是,在大多数 javascript 运行时环境中,使用原型对内存分配有额外的好处。当在构造函数中定义一个函数时,它会为该对象的每个实例分配一个新的函数实例,而像此应答器所做的那样使用原型只会为该类的所有实例分配该函数的一个副本。跨度>
      【解决方案3】:

      你也可以使用Math.round()随机取0或1

      var v = Math.round( Math.random() );
      document.write(this.name + " :  " + this.spells[v]);
      

      【讨论】:

      • 这种洗牌方式对我来说是新的,我喜欢你在那里所做的。您将在哪些情况下使用 Math.round(Math.random())?您可以在其内部使用其他数学课程吗?
      • Math.random 返回 0 到 1 之间的浮点数,Math.round 将浮点数舍入到最接近的整数。使用 Math.{someFunction} 结果时不受限制。可以写成var floatBetween0and1 = Math.random(); var number0or1 = Math.round(floatBetween0and1)
      猜你喜欢
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      相关资源
      最近更新 更多