Javascript - 从原型方法中调用子方法

时间:2015-01-08 03:00:09

标签: javascript inheritance prototype

如果它被覆盖,是否可以从原型方法中调用常规方法?请注意,在给定的示例中,第一个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();

1 个答案:

答案 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