我有一个关于原型和超级在JS中的使用的问题。
我有一个父类Person
。我已经将一个新的toString()
函数挂接到Person.prototype
。
然后,我有一个子类Teacher
(扩展Person
(。我也试图在其原型上重写toString()
方法,但是我希望重用其父方法的toString()
方法的结果。
我试图在Teacher
函数中调用super
对象的toString()
方法,但收到一个错误,说super
未定义。为什么?在super的子函数的原型函数中,是否可以通过super重用父函数的方法?
现在,我知道这个问题可以用另一种方式解决,但我仍然很好奇用上面的方式是否可行。
这里有一些参考代码:
class Person {
name;
email;
constructor(name, email){
this.name = name;
}
}
Person.prototype.toString = function(){
return `name: ${this.name}`
}
class Teacher extends Person{
constructor(name, subject){
super(name);
this.subject = subject;
}
}
Teacher.prototype.toString = function(){
return this.super.toString() + ` subject: ${this.subject}`
}
let teacher = new Teacher("testname", "testSubject");
console.log(teacher.toString());
当您在原型上定义这样的函数时,我不认为super
可用。相反,您应该在类中定义方法并使用super.toString
。像这样:
class Person {
constructor(name, email) {
this.name = name;
}
toString() {
// you were missing `this` here
return `name: ${this.name}`;
}
}
class Teacher extends Person {
constructor(name, subject) {
super(name);
this.subject = subject;
}
toString() {
return super.toString() + ` subject: ${this.subject}`;
}
}
let teacher = new Teacher("testname", "testSubject");
console.log(teacher.toString());