一、原型链
1、含义:就是对象的访问机制。从任何一个数据类型触发,由_proto_串联起来的链状结构,就是原型链
2、原型对象 :是函数天生自带的一个属性 , prototype 是一个对象数据类型
3、对象原型: 是对象天生自带的一个属性 , __proto__ , 指向所属构造函数的原型对象prototype
4、任何一个对象, 如果没有准确的构造函数, 那么看做是 Object 的实例 。所有的纯粹的对象 都是Object的实例
5、原型链的指向图
二、原型链的详解
<script>
function Person(name, age, gender) {
this.name = name
this.age = age
this.gender = gender
}
Person.prototype.sayHi = function() {
console.log('hello world')
}
const p1 = new Person('Jack', 18, '男')
console.log(p1)
</script>
1、p1身上的_proto_指向哪里?
- 因为p1是Person的实例
- 每一个函数天生自带一个属性prototype
- 那么p1._proto_指向所属构造函数的prototype
console.log(p1.__proto__ === Person.prototype) //true
2、Person的_proto_指向哪里?
- Person是一个构造函数,同时也是一个对象,出现了 __proto__ , 这个属性只有对象才有
- 而函数有两层空间 , 现在访问的是对象空间
- JS内有一个构造函数叫做Function,只要是函数,就可以看做Function的实例
- 任何一个函数数据类型所属的构造函数都是 Function
- Person 看做是 Function 的实例
- Person 所属的构造函数就是 Function
- Person._proto_指向 Function.prototype
console.log(Person.__proto__ === Function.prototype)
3、Function的__proto__ 指向哪里?
-
Function 是函数 有了__proto__
-
我们在访问Function的对象空间
-
本质是一个函数
-
只要是函数就是Function 的实例
-
Function自己是自己的实例,指向所属构造函数的原型对象
-
Function 叫做顶级函数
console.log(Function.__proto__ === Function.prototype)
4、Person.prototype的__proto__ 指向哪里?
-
只要出现 __proto__ 一定是对象特有
-
Person.prototype 是一个对象 , 而且是一个纯粹的对象
-
所有的纯粹的对象 都是Object的实例
-
指向 Object 的原型对象
console.log(Person.prototype.__proto__ === Object.prototype)
5、Function.prototype 的__proto__ 指向哪里?
-
只要出现 __proto__ 一定是对象特有
-
Function.prototype 是一个对象 , 而且是一个纯粹的对象
-
所有的纯粹的对象 都是Object的实例
-
指向 Object 的原型对象
Function.prototype.__proto__ === Object.prototype
6、Object 的__proto__ 指向哪里?
-
__proto__属性是对象特有的属性
-
Object是一个内置构造函数
-
现在是函数有了__proto__
-
说明我们在访问Object对象空间
-
本质是一个函数,只要是函数就是Function 的实例
-
指向 Function 的原型对象
Object.__proto__ === Function.prototype
7、Object.prototype 的__proto__ 指向哪里?
-
只要出现 __proto__ 一定是对象特有
-
Object.prototype 是一个对象 , 而且是一个纯粹的对象
-
只要是纯粹的对象都是Object的实例
-
指向Object的原型对象
-
最后的结果是null
-
Object.prototype.__proto__
-
叫做顶级原型
Object.prototype.__proto__ === null