原型链
说明
每个函数身上都有prototype属性,值为一个对象,称为原型对象,这个原型对象有个constructor属性,这个属性值为构造函数本身
constructor的作用:能够说明自身是哪个构造函数的原型对象
prototype 为显式原型属性(程序员使用) , _proto_ 为隐式原型属性(JS引擎的查找规则)
原型链图(必须搞懂)
推理-原型链图
//构造函数,构造函数中的this就是一个个的实例
function Foo() {
this.name = '张三'
}
const f1 = new Foo() //f1是Foo构造函数所new出来的一个实例
const f2 = new Foo()
//验证1.:每个函数身上都有prototype属性
console.log(Foo.prototype) //{constructor: ƒ}
//验证2:原型对象身上的constructor值为构造函数本身
console.log(Foo.prototype.constructor === Foo) //true
//验证3:每个对象身上都有__proto__
console.log(f1.__proto__) //{constructor: ƒ}
//验证4:实例对象f1.__proto===实例缔造者(Foo).prototype
console.log(f1.__proto__ === Foo.prototype) //true
//验证5:实例对象FOO.prototype.__proto__===实例缔造者(Object).prototype
console.log(Foo.prototype.__proto__ === Object.prototype) //true
//验证6:对象Object.prototype.__proto__=== null
console.log(Object.prototype.__proto__ === null) //true
//验证7: Function拥有原型对象
console.log(Function.prototype) //ƒ () { [native code] }
//验证8:Function原型对象的constructor指向Function
console.log(Function.constructor === Function)
//验证9: 构造函数Foo由Function创造,相当于Function的实例对象,实例对象的__proto__等于其缔造者的对象原型
console.log(Foo.__proto__ === Function.prototype) //true
// 验证10:对象老大是Object,Function.prototype还是Object造的,所以对象的__proto__等于其缔造者的prototype
console.log(Function.prototype.__proto__ === Object.prototype) //true
//验证11:Object拥有prototype属性
console.log(Object.prototype) //{constructor: ƒ,}
//验证12: Object.prototype的construdtor属性值为Object
console.log(Object.prototype.constructor === Object) //true
//验证13: 函数中Function是老大,Object相当于实例对象,实例对象的__proto__属性值为其缔造者的原型对象
console.log(Object.__proto__ === Function.prototype) //true