话不多说直接上代码
构造函数创建一个实例对象
function Person(){
}
Person.prototype.name = '张三'
let person1 = new Person()
1. 函数的protopy属性
重点:每个函数都有prototype属性,它是一个对象,指向了构造函数实例对象的原型
什么是原型?
js对象在创建的时候都会与另外一个对象与之关联,称为原型,每个对象都会从原型上继承属性。
console.log(Person.prototype) //构造函数实例对象的原型
2. 对象的__proto__属性
重点:每一个对象(null除外)都有一个__proto__属性指向它的原型
Person.prototype 与 person1的关系是什么呢?
console.log(Person.prototype === person1.__proto__)
3. 对象的constructor属性
重点:每个原型都有一个 constructor 属性指向关联的构造函数
既然实例对象和构造函数都可以指向原型,那么原型是否有属性指向构造函数呢?
console.log(Person.prototype.constructor === Person)
4.关于原型链
重点:当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。
//1. 实例person1对象的__proto__属性 执向 Person构造函数的prototype对象
person1.__proto__ === Person.prototype
//2. Person构造函数的原型对象的__proto__指向 Object构造函数的prototype对象
Person.prototype.__proto__ === Object.prototype
//3. Object构造函数的原型对象__proto__指向 null
Object.prototype.__proto__ === null
console.log(person1.__proto__.__proto__.constructor.prototype.__proto__ === null)//true
console.log(Object.prototype.__proto__ === null) // true
参考大佬文章: javaScript深入之从原型到原型链