创建一个Person类
class Person {
//构造器方法
constructor(name,age){
this.name = name;
this.age = age;
}
//一般方法
speak(){
console.log(`我叫${this.name},我年龄是${this.age}`);
}
}
上述代码所引发知识点及其精解
const person_first = new Person(托尼, 30);
const person_second = new Person(帕克, 25);
问题 1:
请问上述class构造器中的this是谁?
答:this指的就是类的实例对象。
问题 2: speak方法放在了哪里?
答:类的原型对象上(后续会详解,大家先略过),一般情况下,供实例使用。
问题 3:
这里的this指向是谁?
答:分2种情况回答此问题。
- 第一:如果通过Person实例调用speak时,speak中的this就是Person实例
- 第二:举个例子哈,请看下面代码语句
const person_three = new Person(思雨, 92);
person_three.speak.call({name: '小玉', age: 94});
此时this指的就是{name: '小玉', age: 94}, 因为call的作用之一就是可以改变this的指向,通过call调用person_three.speak函数之后 ,this指向发生了变化。
创建一个Student类,继承于Person类
class Student extends Person {
constructor(name,age,grade){
super(name,age);
this.grade = grade;
}
speak(){
console.log(`我叫${this.name},我年龄是${this.age},我读的是${this.grade}年级`);
this.study();
}
study(){
console.log(this + '我很努力的学习');
}
}
上述代码所引发知识点及其精解
问题1 创建的Student类,继承Person类。如果自定义属性如何添加?
答: constructor(name,age,grade){ super(name,age); // 必须调用super, class规定,并且放在自定义属性语句之前 this.grade = grade; }
问题2 study方法放在了哪里?
答: 类的原型对象上,供实例使用,通过Student实例调用study时,study中的this就是Student实例,如果通过call,bind等 即可改变下面红色箭头this的指向。
问题3 如何重写从父类继承过来的方法?
总结
-
类中的构造器不是必须要写的,要对实例进行一些初始化的操作,如添加指定属性时才写。
-
如果A类继承了B类,且A类中写了构造器,那么A类构造器中的super是必须要调用的。
-
类中所定义的方法,都放在了类的原型对象上,供实例去使用。