我正在尝试将PHP类翻译成JavaScript。我唯一遇到的问题是从数组变量中获取一个项目。我创建了一个简单的jsfiddle here。我无法弄清楚为什么它不起作用。
(编辑:我更新了这段代码,以便更好地反映我正在做的事情。抱歉以前的错误。)
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);
答案 0 :(得分: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:Douglas Crockfords用这些话解释道:
按照惯例,我们创建一个私有变量。这是用来制作的 私有方法可用的对象。这是一个解决方法 ECMAScript语言规范中的错误导致此错误 内部功能设置不正确。
要查看完整文章,请前往:http://javascript.crockford.com/private.html
答案 1 :(得分:0)
您永远不会致电classname
。似乎工作正常。
答案 2 :(得分: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]());
答案 3 :(得分:0)
我不确定你要用你正在使用的类结构完成什么,所以我做了一些猜测,但是这段代码通过创建一个包含实例数据和pickone
方法的classname对象来工作:
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/。
答案 4 :(得分:0)
这对我来说很好:http://jsfiddle.net/YznSE/6/你刚刚没有打电话给classname()
。如果你不打电话,什么都不会发生;)
答案 5 :(得分: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);
})();
答案 6 :(得分: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;