当我们创建一个对象时 let obj = { age: 25 }
,我们可以发现能使用很多种函数,但是我们明明没有定义过它们。
当我们在浏览器中打印 obj
时你会发现,在 obj
上居然还有一个 __proto__
属性,那么看来之前的疑问就和这个属性有关系了。
每个js对象都有__proto__
属性,它指向原型,然而现在不多数时候已经不直接使用__proto__
属性。
原型也是一个对象,并且这个对象中包含了很多函数,所以我们可以得出一个结论:
对于 obj
来说,可以通过 __proto__
找到一个原型对象,在该对象中定义了很多函数让我们来使用。
其中constructor属性又有一个prototype属性,所以我们又可以得出一个结论:原型的 constructor
属性指向构造函数,构造函数又通过 prototype
属性指回原型,但是并不是所有函数都具有这个属性,Function.prototype.bind()
就没有这个属性。
原型链
讲到原型链,相信大家都见过这幅图:
其实原型链就是多个对象通过__proto__
属性连接起来。obj通过原型链找到了valueOf函数。
对象的__proto__
属性指向原型,__proto__
将对象和原型连接起来组成了原型链;
函数的prototype是一个对象;
Object是所有对象的原型,所有对象可以通过__proto__
找到它;
Function是所有函数的原型,所有函数可以通过__proto__
找到它;