老师,除了第一个作为函数调用,后面的怎么理解呢?我都懵了

来源:4-3 super

卷毛奋斗中

2022-07-22 15:07:35

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>super</title>
</head>
<body>
<script>
// 1.作为函数调用
// 代表父类的构造方法,只能用在子类的构造方法中,用在其他地方就会报错
// super 虽然代表了父类的构造方法,但是内部的 this 指向子类的实例
// class Person {
//   constructor(name) {
//     this.name = name;

//     console.log(this);
//   }
// }
// class Programmer extends Person {
//   constructor(name, sex) {
//     super(name, sex);
//   }

//   // hi() {
//   //   super(); // ×
//   // }
// }
// // new Person();
// new Programmer();

// 2.作为对象使用
// 2.1.在构造方法中使用或一般方法中使用
// super 代表父类的原型对象 Person.prototype
// 所以定义在父类实例上的方法或属性,是无法通过 super 调用的
// 通过 super 调用父类的方法时,方法内部的 this 指向当前的子类实例
// class Person {
//   constructor(name) {
//     this.name = name;

//     console.log(this);
//   }

//   speak() {
//     console.log('speak');
//     // console.log(this);
//   }

//   static speak() {
//     console.log('Person speak');
//     console.log(this);
//   }
// }
// class Programmer extends Person {
//   constructor(name, sex) {
//     super(name, sex);

//     // console.log(super.name);
//     // super.speak();
//   }

//   // hi() {
//   //   super(); // ×
//   // }

//   speak() {
//     super.speak();
//     console.log('Programmer speak');
//   }

//   // 2.2.在静态方法中使用
//   // 指向父类,而不是父类的原型对象
//   // 通过 super 调用父类的方法时,方法内部的 this 指向当前的子类,而不是子类的实例
//   static speak() {
//     super.speak();
//     console.log('Programmer speak');
//   }
// }
// // new Person();
// // new Programmer();
// Programmer.speak();

// 3.注意事项
// 使用 super 的时候,必须显式指定是作为函数还是作为对象使用,否则会报错
class Person {
constructor(name) {
this.name = name;
}

speak() {
console.log('speak');
}
}
class Programmer extends Person {
constructor(name, sex) {
super(name, sex);

// console.log(super);
// console.log(super());
// console.log(super.speak);
}
}
</script>
</body>
</html>


写回答

1回答

好帮手慕久久

2022-07-22

同学你好,关于super的内容,不需要做过多理解,都是固定内容,记住就行了。比如super可以作为对象使用,此时使用方式是“对象.xxx”,比如super.speak、super.name:

https://img.mukewang.com/climg/62da5d270933156a06230454.jpg

当super作为对象使用时,super 代表父类的原型对象 Person.prototype这句话是结论,记在笔记中。

speak方法是定义在原型对象上的,而name是定义在父类实例自身上的属性:

https://img.mukewang.com/climg/62da5dc3097bb91c05260287.jpg

所以super.speak是可以访问到的,而super.name就访问不到会得到undefined。

关于this指向,也是固定的内容,能根据结论对应上代码的执行结果就可以。

同学多听几遍视频,看看能不能懂,如果哪里有问题,可以新建一个问题提问,老师们再为你解答。

祝学习愉快!

0

0 学习 · 17877 问题

查看课程