1.prototype : 每个函数都有一个prototype属性,代表着该函数的原型
2. __proto__: 每个对象都有一个__proto__属性,代表该函数的隐式原型(javascript开发者不希望用户使用这样的一个属性),也可以称为该对象的构造函数的原型
// 我们可以这样理解
let obj = {}
// 对象的隐式原型等于其构造函数的原型
obj.__proto__ === Object.prototype // true
// 其中函数的原型的构造函数等于自己
Object.prototype.constructor === Object // true
// 值得注意的是Object原型的隐式原型等于null
Object.prototype.__proto__===null // true
在javascript中函数也是一类对象,作为一种特殊的对象存在,所以函数也存在__proto__属性
// 那么同理函数的隐式原型等于其构造函数的原型,所有函数的构造函数等于Function,所以
fun.__proto__ === Function.prototype // true
引用了,一张互联网上经常看见的图,我觉得第一次看的时候,可能还不是很明白,相信你多看几遍之后,一定会有深刻的理解。
3.原型链
通过上面的的关系我们可以得知,当我们进行访问一个对象的属性的时候,我们会先在该对象的作用域中进行查找,如果找不到就到函数的原型对象中去找,同时这个原型对象也可能是其他构造函数的实例对象,这样的层层关系,我们就称为原型链。