2012-03-10 74 views
1

我想一个PHP类翻译成JavaScript。我遇到的唯一问题是从数组变量中获取项目。我创建了一个简单的jsfiddle here。我无法弄清楚为什么它不起作用。Javascript数组是不确定的...我不知道为什么

(编辑:我更新了这个代码,以更好地反映我在做什么对不起,我以前的错误)

function tattooEightBall() { 

this.subjects = ['a bear', 'a tiger', 'a sailor']; 

this.prediction = make_prediction(); 

var that = this; 



function array_random_pick(somearray) { 
     //return array[array_rand(array)]; 
     var length = somearray.length; 

     var random = somearray[Math.floor(Math.random()*somearray.length)]; 
    return random; 


} 


function make_prediction() { 

    var prediction = array_random_pick(this.subjects); 
    return prediction; 
} 

} 
var test = tattooEightBall(); 
document.write(test.prediction); 

回答

4

做工精细这里,你是不是简单的调用

classname(); 

后您定义的功能。

更新

当你拨打电话到* make_prediction *,不会在范围之内。你是正确的金钱创造一个变量,用它在* make_prediction *:

var that = this; 

this.prediction = make_prediction(); 

function make_prediction() { 
    var prediction = ''; //initialize it 

    prediction = prediction + array_random_pick(that.subjects); 
    return prediction; 
} 

这里你可以看到一个工作版本:http://jsfiddle.net/zKcpC/

这实际上是非常复杂的,我相信有人更多的Javascript经验或许能够澄清这种情况。

EDIT2:道格拉斯康乐福用这句话解释了它:

按照惯例,我们做一个私有变量。这用于使 对象可用于私有方法。这是 在ECMAScript的语言规范的错误导致这 不正确地设置于内功能的解决方法。

看到完整的文章头:http://javascript.crockford.com/private.html

+0

哈!对不起,我把代码剥离得太多了,我想它解决了我的问题。 http://jsfiddle.net/YznSE/7/ – emersonthis 2012-03-10 01:10:19

+0

爱默生,所以它仍然不工作:我和我的代码更准确的版本(不工作)修改后的代码?如果你能提供你工作,你拥有的页面,或骗取钱财的确切功能/用法,我们也许能够提供帮助。 – Nathan 2012-03-10 01:13:50

+0

它应该现在在更新的链接。谢谢。 – emersonthis 2012-03-10 01:16:46

0

你永远不会调用classname。似乎工作正常。

0

工作对我来说:

(function classname() { 

this.list = []; 
this.list[0] = "tiger"; 
this.list[1] = "lion"; 
this.list[2] = "bear"; 

function pickone(somearray) { 
    var length = somearray.length;   
    var random = somearray[Math.floor(Math.random()*length)]; 
    return random; 
} 


var random_item = pickone(this.list); 

document.write(random_item); 

}()); 

是你实际调用classname功能?请注意我包你的代码块:

([your_code]()); 
0

我不知道你想与您正在使用,所以我做了一些猜测阶级结构究竟做到什么,但是这个代码通过创建一个类名对象有实例数据和pickone方法:

function classname() { 

    this.list = []; 
    this.list[0] = "tiger"; 
    this.list[1] = "lion"; 
    this.list[2] = "bear"; 

    this.pickone = function() { 
     var length = this.list.length;   
     var random = this.list[Math.floor(Math.random()*length)]; 
     return random; 
    } 
} 

var cls = new classname(); 
var random = cls.pickone(); 

你可以用它不断的在这里玩:http://jsfiddle.net/jfriend00/ReL2h/

0

使之成为像这样的自动执行功能:

(function classname() { 

this.list = []; 
this.list[0] = "tiger"; 
this.list[1] = "lion"; 
this.list[2] = "bear"; 

function pickone(somearray) { 
    var length = somearray.length; //<---WHY ISN'T THIS DEFINED??  
    var random = somearray[Math.floor(Math.random() * length)]; 
    return random; 
} 


var random_item = pickone(this.list); 

document.write(random_item); 
})(); 
0
var test = tattooEightBall(); 
document.write(test.prediction); 

应该是:

var test = new tattooEightBall(); //forgot new keyword to create object 
document.write(test.prediction()); // forgot parens to fire method 

和:

this.prediction = make_prediction(); 

应该是:

this.prediction = make_prediction;