淘宝2007年的一道面试题
淘宝2007年有这样一个面试题:
小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。
从这段描述可以得到以下对象:
function Dog() { this.wow = function() { alert(’Wow’); } this.yelp = function() { this.wow(); } }小芒和小贤一样,原来也是一条可爱的小狗,可是突然有一天疯了(MadDog),一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。
请根据描述,按示例的形式用代码来实现(提示关键字: 继承,原型,setInterval)。
淘宝UED上给出的答案是:
function MadDog() {
this.yelp = function() {
var self = this;
setInterval(function() {
self.wow();
}, 500);
}
}
MadDog.prototype = new Dog();
//for test
var dog = new Dog();
dog.yelp();
var madDog = new MadDog();
madDog.yelp();
经过我的测试发现:如果把self.wow后面的括号去掉,那么外面那层匿名函数也是可以去掉了,所以setInterval部分可以这么写:
setInterval(self.wow,500);
后来我又尝试了两外一种解法:
MadDog=new Function;
MadDog.prototype=new Dog();
MadDog.prototype.yelp=function() {
setInterval(this.wow,500);
}
//for test
var madDog=new MadDog();
madDog.yelp();
这种写法看上去要比淘宝上的答案要简单,经测试也是可以达到题目要求的。既然MadDog的yelp方法要变,那就就直接在后面把从Dog继承来的prototype属性覆盖一遍就OK了,不知道这种写法有没有什么不妥,毕竟人家都是高手,而我只是菜鸟一个。
哈哈。。无意中闯入,看到这么有趣的题。。。
我也给个答案,直接借用父类的构造函数:
function MadDog(){
Dog.apply(this,null);
this.yelp=function(){
var _this=this;
setInterval(_this.wow,500)
}
}
QiQiBoY
4 Dec 10 at 10:50 pm