这是一个三部分问题。
在下面显示的代码中,每当我执行函数(walk,run,crawl)时,我都会观察到它以累积方式显示方法distance_travelled的输出:
Trey说谢谢你 特雷走了3 distance的距离 特雷跑了13岁 特雷爬了16岁 特雷跑了26岁
我想确保每个函数通过将distance_travelled方法初始化为 0 来计算距离。
我的第二个问题与回调函数有关。
我正在尝试创建另一个名为doSomething()的属性/方法,并让此方法返回一个随机函数(walk,run,crawl)。
例如,如果我执行以下代码:
var returned_function = person.doSomething();
returned_function();
它应该执行三种方法之一。我已设法执行方法 run()。但是,当我在浏览器中运行代码时,警告弹出消息显示未定义。此外,我遇到了与第一个问题相同的问题。它以累积方式计算distance_travelled。我该如何解决这个问题?
我的第三个问题。我正在尝试向 person 对象添加一个名为“ fly ”的新方法。 'fly'方法将两个函数作为参数。
我必须有30%的机会让这个人飞。如果此人成功飞行,则应执行函数fly方法(30%的可能性会发生这种情况)。如果此人不能飞行,则应执行第二个功能(70%的可能性会发生这种情况)。
如何在我的代码中实现此功能?有人可以建议如何解决这个问题吗?
<script type="text/javascript">
var person = new Object();
person.name = "Trey";
person.distance_travelled = 0;
person.say_name = alert(person.name);
person.say_something = function(xyz) {
document.write(person.name + " says " + xyz + '<br>');
}
person.say_something("thank you");
person.walk = alert(person.name + " is walking");
function walk(){
person.distance_travelled +=3;
document.write(person.name + " walked a distance of " + person.distance_travelled + '<br>');
}
walk();
person.run = alert(person.name + " is running");
function run(){
person.distance_travelled +=10;
document.write(person.name + " ran a distance of " + person.distance_travelled + '<br>');
}
run();
person.crawl = alert(person.name + " is crawling");
function crawl(){
person.distance_travelled +=3;
document.write(person.name + " crawled a distance of " + person.distance_travelled + '<br>');
}
crawl();
person.doSomething = function(abc){
alert(run());
}
var returned_function = person.doSomething();
returned_function();
</script>
答案 0 :(得分:0)
首先:
person.walk = alert(person.name + " is walking");
可能没有像你想象的那样(因为我不能认为这样的界限可能有意义)。
你的第一个问题很简单。如果您想输出3
,只需输出3
,而不是distance_travelled
。
第二个问题:
var activities = ['run', 'walk', 'crawl'];
person.doSomething = function() {
var randomActivity = activities[Math.floor(Math.random() * activities.length)];
return function() {
this[randomActivity]();
}
}
var personDoActivity = person.doSomething();
personDoActivity();
或
person.doSomething = function() {
var activities = [this.run, this.walk, this.crawl];
var randomActivity = activities[Math.floor(Math.random() * activities.length)];
return randomActivity;
}
var doActivity = person.doSomething();
doActivity.call(person);
第三个问题(我正在将它从面向对象改为程序,因为你还没有正确使用OO):
function maybeFly(fly, noFly) {
if (Math.random() < 0.3) {
return fly();
} else {
return noFly();
}
}
答案 1 :(得分:0)
因为我仍然无法评论答案-.-
@Amadan
使用.bind()
,doSomething的第二个版本可能更好person.doSomething = function() {
var activities = [this.run, this.walk, this.crawl];
var randomIndex = Math.floor(Math.random() * activities.length);
return activities[randomIndex].bind(this);
}
var doActivity = person.doSomething();
doActivity();
另外值得注意的是,它更好用,更多的是用javascript的精神来编写
var person = {};
而不是
var person = new Object();