原型与原型链,继承里面的原型链

140 阅读1分钟

1. 函数的原型属性

  1. 函数的原型prototype属性:每个函数都有一个prototype显式原型属性,它默认指向一个Object对象(原型对象)
  2. 原型对象中有一个属性constructor,它指向函数对象
  3. 函数的显式原型指向的对象默认是空Object实例对象(但Object不满足)
  4. 所有函数都是Function的实例(包括Function),所有函数的__proto__都是一样的
  5. Object的原型对象是原型链尽头

2. 引用类型的隐式原型属性

  1. 引用类型,都具有对象属性,即可以自由扩展属性
  2. 引用类型,即实例对象,都有一个隐式原型__proto__属性,属性值是一个普通的对象

3. 显式原型与隐式原型

  1. 每个函数function都有一个prototype,即显式原型(属性)
  2. 每个实例对象都有一个__proto__,称为隐式原型(属性)
  3. 对象的隐式原型的值为其对应构造函数显式原型的值

4.原型链

访问一个对象的属性时,

  1. 先在自身属性中查找,找到返回
  2. 如果没有,再沿着__proto__这条链向上查找,找到返回
  3. 如果最终没有找到,返回undefined

别名:隐式原型链 作用:查找对象的属性 在这里插入图片描述

5.class类继承中的原型链

class A
class B extends A

b>b.proto(B.prototype)=>b.proto.proto__(A.prototype)=>b.proto.proto.proto(Object.prototype)=>b.proto.proto.proto.proto(Object.prototype.proto)===null

a=>a.proto(A.prototype)=>a.proto.proto(Object.prototype)

  <script>
      class A{}
      class B extends A{}
      const a=new A()
      const b=new B()
      console.log(a.__proto__===A.prototype)
      console.log(b.__proto__===B.prototype)
      console.log(B.__proto__===A)
      console.log(B.prototype.__proto__===A.prototype)
      console.log(b.__proto__.__proto__===A.prototype)
      console.log('-----------------------')
      console.log(b.__proto__===B.prototype)
      console.log(b.__proto__.__proto__===A.prototype)
      console.log(b.__proto__.__proto__.__proto__===Object.prototype)
      console.log(b.__proto__.__proto__.__proto__.__proto__===Object.prototype.__proto__)
      console.log(b.__proto__.__proto__.__proto__.__proto__===null)
      console.log('-----------------------')
      console.log(a.__proto__===A.prototype)
      console.log(a.__proto__.__proto__===Object.prototype)
      console.log(a.__proto__.__proto__.__proto__===null)

  </script>