一、prototype 显式原型
所有Function的实例都是函数对象,而其他的都称之为普通对象。
**
在JavaScript中,每个函数都有一个prototype属性,这个属性指向函数的原型对象。有以下这些特性:
- 原型(prototype)是所有函数的属性,并不只是构造函数所特有
在创建任何一个函数时,prototype就已经作为这个函数的属性被引擎自动创建了
注:此处有一个例外,为Function.prototype。它的typeof为functon,然而它没有
prototype
属性- prototype属性值为一个对象,因此我们也称prototype为原型对象
原型的概念**:每一个javascript对象(除null外)创建的时候,就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型中“继承”属性。
让我们用一张图表示构造函数和实例原型之间的关系:
二、proto 隐式原型
prototype是函数对象所特有的,而proto是所有对象(除null外)都有的。
下面这张图具体的介绍了他们直接的关系
三、原型链
当我们 调用 对象中某个 属性或方法 时,如果在 当前对象中找不到目标属性或者方法 ,则会去当前对象 __proto__
指向的原型对象 中寻找。如果原型对象中依然没有,则到 原型对象 的 __proto__
指向的对象原型里面找,直到找到为止 ,如果在 最顶层对象中仍然没有找到 ,就结束查找,返回 undefined
。
对象的原型proto指向其构造函数的prototype属性,而构造函数的prototype也有自己的原型,沿着原型链一直向上回溯,直到找到Object.prototype,而Object.prototype没有原型了,其proto为null,因此其为原型链的终点。