Javascript - 从原型方法内部调用子方法

Javascript - Calling a child method from inside a prototype method

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

问题是当 eat 第一次被调用时,您的熊没有 goToSleep 方法。

当您在 Bear 构造函数中调用 Animal.call(this) 时,它会调用 eat - 在 Bear.prototype 上找到并调用。然后 eat 尝试调用 goToSleepgoToSleep 是您尚未添加的实例方法(请记住,我们仍在 Animal.call 我们尚未达到 this.goToSleep = function() 还没有)。

除非你有充分的理由,否则 goToSleep 也应该是原型方法,就像 eat:

Bear.prototype.goToSleep = function(){
  console.log("Bears go to sleep after they eat");
};

这将随心所欲

或者,如果 goToSleep 必须 是实例方法(因为它需要访问您在构造函数中创建的某些私有状态),则只需切换顺序你的 Animal.callthis.goToSleep 行:

this.goToSleep = function() // etc.
Animal.call(this);