一张图来说明:
总结:
- 只有函数才拥有prototype属性,构造函数的.prototype为一个对象
- 每个对象都有一个隐式的原型属性[[prototype]], 但由于[[prototype]]是内部属性,不能访问,用 proto 代替, 浏览器实现存在兼容性
每个对象的 proto 指向了其构造函数的原型对象,形成原型链,因此对象可以访问到不属于其定义的属性
Object.prototype 和 Function.prototype是由js引擎创建的, 引擎将Function.prototype.proto指向Object.prototype,Object.prototype.proto指向null
Object.prototype 是所有对象的爸爸,所有对象都可以通过 proto 找到它
Function.prototype 是所有函数的爸爸,所有函数都可以通过 proto 找到它
对象的 proto 指向原型, proto 将对象和原型连接起来组成了原型链, 所以准确的原型链描述应该是{}.proto.proto等等
所有的函数都可以认为是通过new Function出来的,所以所有函数都能通过原型链 proto 找到Function.prototype, Function本身也一样,即Function.proto === Function.prototype。
Object和Function都是构造函数,所以Object也是Function的实例对象。Object.proto === Function.proto === Function.prototype