如果它被覆盖,是否可以从原型方法中调用常规方法?请注意,在给定的示例中,第一个eat()方法是从Animal函数的主体调用的 - 这是要求。
Animal = function(){
this.eat();
};
Animal.prototype.eat = function() {
console.log("All animals eat");
};
Bear = function(){
Animal.call(this);
this.goToSleep = function(){
console.log("Bears go to sleep after they eat");
}
};
Bear.prototype = Object.create(Animal.prototype);
Bear.prototype.eat = function() {
console.log("Bears eat honey");
this.goToSleep(); //returns 'undefined is not a function'
//How do I invoke this.goToSleep() ?
};
var winnie = new Bear();
答案 0 :(得分:1)
问题是,当goToSleep
首次被调用时,您的熊没有eat
方法。
当您在Animal.call(this)
构造函数中调用Bear
时,它会调用eat
- 在Bear.prototype
上找到并调用。然后eat
尝试调用goToSleep
,但goToSleep
是一个尚未添加的实例方法(请记住,我们仍然在Animal.call
我们没有'}达到了this.goToSleep = function()
。
除非你有充分的理由,goToSleep
也应该是原型方法,就像eat
一样:
Bear.prototype.goToSleep = function(){
console.log("Bears go to sleep after they eat");
};
这将正常工作,如你所愿。
或者,如果goToSleep
具有作为实例方法(因为它需要访问您在构造函数中创建的某个私有状态),那么只需切换{{1 }和Animal.call
行:
this.goToSleep