一、原型对象
JavaScript 中,万物皆对象。但对象也是有区别的。分为普通对象和函数对象,每当定义一个对象的时候,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象。
2.1__proto__
这是每个对象都有的隐式原型属性,指向了创建该对象的构造函数的原型。其实这个属性指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们并不能访问到,所以使用__proto__ 来访问。
因为在 JS 中是没有类的概念的,为了实现类似继承的方式,通过__proto__ 将对象和原型联系起来组成原型链,得以让对象可以访问到不属于自己的属性。
new 的过程
新生成了一个对象
链接到原型
绑定 this
返回新对象
2.2prorotype
prototype 这是一个显式原型属性,只有函数才拥有该属性。基本上所有函数都有这个属性,但是也有一个例外
这里有个公式
由于__proto__是任何对象都有的属性,而js里万物皆对象,所以会形成一条__proto__连接起来的链条,递归访问__proto__必须最终到头,并且值是null。
当js引擎查找对象的属性时,先查找对象本身是否有改属性,如果不存在,会在原型链上查找,但不会查找自身的prototype
四、总结
Object 是所有对象的爸爸,所有对象都可以通过__proto__ 找到它,
Function 是所有函数的爸爸,所有函数都可以通过__proto__ 找到它
Function.prototype 和 Object.prototype 是两个特殊的对象,他们由引擎来创建 除了以上两个特殊对象,其他对象都是通过构造器 new 出来的
函数的 prototype 是一个对象,也就是原型
对象的__proto__ 指向原型,proto 将对象和原型连接起来组成了原型链