通过class进一步理解原型和原型链

1 篇文章 0 订阅
1 篇文章 0 订阅

通过class进一步理解原型和原型链

class Persion{
      constructor(name,age){
        this.name = name
        this.age = age
      }
    }
let xiaoming = new Persion("xiaoming",20)
 console.log(xiaoming)

打印结果如下:

在这里插入图片描述

我们再来看上面用class原型生成实例的打印结果,Persion实例有隐式属性__proto__,指向了它的原型Persion的prototype,Persion同时也是一个对象,是由Object构造的,最终原型链又指向了Object。

什么是原型:其实就是构造函数里面有一个prototype属性,而prototype属性里面有constructor,那么constructor的作用是什么呢,它其实指向的是构造函数本身。

用class我们可以很方便的实现继承,使用extends关键字

class Persion{
  constructor(name,age){
    this.name = name
    this.age = age
  }
}
class Student extends Persion{
  constructor(name,age){
    super(name,age)
  }
}
let xiaoming = new Student("xiaoming",20);
console.log(xiaoming)

在这里插入图片描述
我们可以看到,使用extends继承也是可以通过原型链逐级查找到Object对象的。

这时候如果我们在Persion上添加一个方法say,尝试打印继承了Persion的Student原型生成的实例xiaoming的say()方法。

class Persion{
     constructor(name,age){
       this.name = name
       this.age = age
     }
     say(){
       console.log("hi")
     }
   }
   class Student extends Persion{
     constructor(name,age){
       super(name,age)
     }
   }
   let xiaoming = new Student("xiaoming",20);
   console.log(xiaoming)
   xiaoming.say();//hi

在控制台看出,xiaoming.say()成功执行了,这就印证了原型链逐级查找的特点,首先xiaoming在自己内部查找say方法,但是没有查到,这时候自动向下继续查找say方法,这时候查到了Persion原型上有这个方法,那么就相当于xiaoming有了say方法
在这里插入图片描述
总结:1 实例的__proto__===原型的prototype

2 原型链具有逐级查找特性:先自身查找,如果没有那就去自身原型的prototype属性上找,如果prototype属性上没有,那就用._proto_上找,一直找到最顶层的Object上找,直返返回null为止。

3 xiaoming能调到say方法,persion和people都能调到say方法,这时候可以用xiaoming.hasOwnProperty(‘say’)判断,返回false

ps:补充一个知识点,用 a instanceof b 可以判断a是不是b生成的实例,或者叫b是不是a的原型,只要b在a所处的上游原型链上,就返回true

举个🌰:xiaoming instanceof Student //true
      xiaoming instanceof People  //true
      xiaoming instanceof Object  //true
      xiaoming instanceof Array //false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值