1. 函数的原型属性
- 函数的原型prototype属性:每个函数都有一个prototype显式原型属性,它默认指向一个Object对象(原型对象)
- 原型对象中有一个属性constructor,它指向函数对象
- 函数的显式原型指向的对象默认是空Object实例对象(但Object不满足)
- 所有函数都是Function的实例(包括Function),所有函数的__proto__都是一样的
- Object的原型对象是原型链尽头
2. 引用类型的隐式原型属性
- 引用类型,都具有对象属性,即可以自由扩展属性
- 引用类型,即实例对象,都有一个隐式原型__proto__属性,属性值是一个普通的对象
3. 显式原型与隐式原型
- 每个函数function都有一个prototype,即显式原型(属性)
- 每个实例对象都有一个__proto__,称为隐式原型(属性)
- 对象的隐式原型的值为其对应构造函数显式原型的值
4.原型链
访问一个对象的属性时,
- 先在自身属性中查找,找到返回
- 如果没有,再沿着__proto__这条链向上查找,找到返回
- 如果最终没有找到,返回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>