原型和原型链
class Person {
constructor(name) {
this.name = name;
}
drink() {
console.log('喝水');
}
}
class Teacher extends Person {
constructor(name, subject) {
super(name);
this.subject = subject;
}
teach() {
console.log(`我是${this.name},教${this.subject}.`)
}
}
const teacher = new Teacher(`小明`,`英语`);
console.log(`teacher`, teacher);
teacher.teach();
teacher.drink();
解释
- 原型链有显示原型和隐式原型两个概念,如以上代码可以这么理解,
- Person类是第一个类,因此它里面的所有方法看作显式原型,
- 然后是Teacher类,继承了Person类,因此Person类里面的显式原型变成了Teacher类里面的隐式原型,
- 然后嘞,teacher是被Teacher给new出来的,因此Teacher里面的teach()方法就是teacher的隐式原型,而teacher的显式原型是自己的name、subject两个参数。
- 就比如说上述代码的最后两行的调用,teacher本身没有的就会去隐式原型里面去找,找不到又去上一层找,因此就类似于一条链条,所以叫做原型链,以下图示看起来就类似于指针。
- 或许换通俗一点的话来说,自己有的就是自己的显示原型,自己没有的,但是可以通过渠道调用别人的就是自己的隐式原型。
- 那还有一个方法可以验证该属性或者方法是不是自身的,例如输入teacher.hasOwnProperty(‘name’),会返回一个true,而输入teacher.hasOwnProperty(‘teach’),会返回false。
- 关于图示中的Object,几乎所有的对象都是Object的实例,也就是说他们都继承自Object.prototype,Object.prototype是原型链的顶端,它包含一些基本的方法和属性,所有的对象都可以访问这些方法和属性。呐,因此我们也可以说Object里面的方法是Person类的隐式原型,如下图所示。
- 图示