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
尝试调用 goToSleep
但 goToSleep
是您尚未添加的实例方法(请记住,我们仍在 Animal.call
我们尚未达到 this.goToSleep = function()
还没有)。
除非你有充分的理由,否则 goToSleep
也应该是原型方法,就像 eat
:
Bear.prototype.goToSleep = function(){
console.log("Bears go to sleep after they eat");
};
这将随心所欲。
或者,如果 goToSleep
必须 是实例方法(因为它需要访问您在构造函数中创建的某些私有状态),则只需切换顺序你的 Animal.call
和 this.goToSleep
行:
this.goToSleep = function() // etc.
Animal.call(this);
如果原型方法被覆盖,是否可以从原型方法中调用常规方法?请注意,在给定的示例中,第一个 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
尝试调用 goToSleep
但 goToSleep
是您尚未添加的实例方法(请记住,我们仍在 Animal.call
我们尚未达到 this.goToSleep = function()
还没有)。
除非你有充分的理由,否则 goToSleep
也应该是原型方法,就像 eat
:
Bear.prototype.goToSleep = function(){
console.log("Bears go to sleep after they eat");
};
这将随心所欲。
或者,如果 goToSleep
必须 是实例方法(因为它需要访问您在构造函数中创建的某些私有状态),则只需切换顺序你的 Animal.call
和 this.goToSleep
行:
this.goToSleep = function() // etc.
Animal.call(this);