原型链
+ 只要是 数组数据类型, 所属构造函数就是 Array
+ 只要是 函数数据类型, 所属构造函数就是 Function
+ 只要是 正则数据类型, 所属构造函数就是 RegExp
+ 只要是 对象数据类型, 所属构造函数就是 Object
+ 原型链: 对象的 __proto__ 串联起来的对象链状结构
+ 目的: 对象访问机制
=> 当你访问一个对象成员的时候, 首先在自己身上查找, 如果有, 直接使用, 停止查找
=> 如果没有, 会自动去到自己的 __proto__ 查找, 如果有直接使用, 停止查找
=> 如果还没有, 就再去 __proto__ 上查找, 如果有直接使用, 停止查找
=> 以此类推, 直到 Object.prototype 都没有的时候, 返回 undefined
问题1: p 的 __proto__ 指向谁 ?
=> 对象的 __proto__ 指向所属构造函数的 prototype
=> 因为 p 的所属构造函数是 Person
=> p.__proto__ === Person.prototype
问题2: Person.prototype 是一个对象, __proto__ 指向谁 ?
=> Person.prototype 是一个对象数据类型
=> 它多数的构造函数就是 Object
=> Person.prototype.__proto__ === Object.prototype
问题3: Person 是函数的同时也是一个对象, __proto__ 指向谁 ?
=> Person 是一个函数数据类型
=> 它所属的构造函数就是 Function
=> Person.__proto__ === Function.prototype
问题4: Object.prototype 是一个对象, __proto__ 指向谁 ?
=> Object.prototype.__proto__ 指向 null
=> 因为我们管 Object.prototype 叫做顶级原型
问题5: Object 是函数的同时也是一个对象, __proto__ 指向谁 ?
=> Object 是一个内置构造函数, 也是一个构造函数, 也是一个函数
=> 只要是函数, 所属的构造函数就是 Function
=> Object 所属的构造函数就是 Function
=> Object.__proto__ === Function.prototype
问题6: Function.prototype 是一个对象, __proto__ 指向谁 ?
=> Function.prototype 是一个对象数据类型
=> 它所属的构造函数就是 Object
=> Function.prototype.__proto__ === Object.prototype
问题7: Function 是函数的同时也是一个对象, __proto__ 指向谁 ?
=> Function 是一个内置构造函数, 也是一个构造函数, 也是一个函数
=> 只要是函数, 所属的构造函数就是 Function
=> Function 自己是自己的实例, 自己是自己的构造函数
=> 我们管 Function 叫做顶级函数
=> Function.__proto__ === Function.prototype
*/
function Person() {
this.name = 'Jack'
this.age = 18
this.gender = '男'
}
Person.prototype.sayHi = function () {}
const p = new Person()
console.log(p.__proto__ === Person.prototype)
console.log(Person.prototype.__proto__ === Object.prototype)
console.log(Person.__proto__ === Function.prototype)
console.log(Object.prototype.__proto__ === null)
console.log(Object.__proto__ === Function.prototype)
console.log(Function.prototype.__proto__ === Object.prototype)
console.log(Function.__proto__ === Function.prototype)
以上打印结果均为true
详细图解: