JS学习--原型和原型链

128 阅读2分钟

一、原型对象

JavaScript 中,万物皆对象。但对象也是有区别的。分为普通对象和函数对象,每当定义一个对象的时候,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象。

二、prototype和__proto__

2.1__proto__

这是每个对象都有的隐式原型属性,指向了创建该对象的构造函数的原型。其实这个属性指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们并不能访问到,所以使用__proto__ 来访问。

因为在 JS 中是没有类的概念的,为了实现类似继承的方式,通过__proto__ 将对象和原型联系起来组成原型链,得以让对象可以访问到不属于自己的属性。

所以可以说,在 new 的过程中,新对象被添加了__proto__ 并且链接到构造函数的原型上。

 new 的过程
 新生成了一个对象
 链接到原型
 绑定 this
 返回新对象

2.2prorotype

prototype 这是一个显式原型属性,只有函数才拥有该属性。基本上所有函数都有这个属性,但是也有一个例外

如果你以上述方法创建一个函数,那么可以发现这个函数是不具有 prototype 属性的。

这里有个公式

这是因为o1和o2的toString是在__proto__(共有属性)里

三、原型链

由于__proto__是任何对象都有的属性,而js里万物皆对象,所以会形成一条__proto__连接起来的链条,递归访问__proto__必须最终到头,并且值是null。

当js引擎查找对象的属性时,先查找对象本身是否有改属性,如果不存在,会在原型链上查找,但不会查找自身的prototype

四、总结

Object 是所有对象的爸爸,所有对象都可以通过__proto__ 找到它,

Function 是所有函数的爸爸,所有函数都可以通过__proto__ 找到它

Function.prototype 和 Object.prototype 是两个特殊的对象,他们由引擎来创建 除了以上两个特殊对象,其他对象都是通过构造器 new 出来的

函数的 prototype 是一个对象,也就是原型

对象的__proto__ 指向原型,proto 将对象和原型连接起来组成了原型链