2016-07-23 85 views
0

问题:我试图创建一个名为向导一个构造函数有两个参数:名称和法术,然后创建一个向导对象:如何创建构造函数?

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

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

目的:调用castSpell方法来显示一个随机的法术,像这样: Gorrok:胡言乱语

代码:我只写了下面的代码,到目前为止,我停留在这个阶段!

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(); 

回答

2

所以,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(); 
0

您还可以使用Math.round()得到0或1随机

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

洗牌的这种方式是新的给我,我喜欢你做了什么没有。究竟在哪种情况下你会使用Math.round(Math.random())?你可以在其中使用其他数学类吗? – ratboy

+0

'Math.random'返回0到1之间的浮点数,'Math.round'将浮点数四舍五入到最接近的整数。当您使用Math。{someFunction}结果时,您不受限制。它可以像'var floatBetween0and1 = Math.random(); var number0or1 = Math.round(floatBetween0and1)' – Freez

1

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

下面是一个例子,从W3:

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

值得指出的是,在大多数JavaScript运行时环境中,使用原型对内存分配有额外的好处。当在构造函数中定义一个函数时,它会为该对象的每个实例分配一个新的函数实例,同时使用原型作为该答案已完成的操作将只将该函数的一个副本分配给该类的所有实例。 – Paul