<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function Person(name, age) {
this.name = name
this.age = age
this.sayHi = function () {
console.log('hello')
}
}
let p1 = new Person()
console.log(p1)
// _proto_又指向哪里呢
// 实例对象 是由构造函数new出来的
// 那么这个实例对象上的_proto_就指向这个构造函数的prototype
// 我们发现实例对象的_proto_和构造函数的prototype是同一个对象空间
// 所以,我们可以通过构造函数的函数名来向prototype添加内容
// 实例对象访问自己的属性时,自己身上有就直接用,没有的话自动去自己身上的_proto_上找
// 那么对象就可以使用函数的prototype里面的内容了
// 我们的原型有个链状结构
// 当一个对象我们不知道是谁都结构的时候,我们可以把他看成是object的实例对象
// 也就是说,我们构造函数的prototype的_proto_指向object.prototype
// 那么这个object.prototype也是一个对象,他的_proto_最终指向js的null
// 因为我们的object是js的顶级构造函数,我们js万物皆对象
// 所以object.prototype就到头了
// 原型链:从实例对象开始沿着_proto_形成的链式结构就是这个实例对象的原型链
</script>
</body>
</html>