原型的基本概念:
每个实例对象都有一个私有属性[[Prototype]]
(谷歌、火狐浏览器中实现为__proto__
)指向创建他的构建函数的原型对象prototype
。__proto__
我们称之为隐式原型,prototype
为显式原型。 接下来我们在控制台中看看原型的指向。
在控制台中我们创建一个对象,并且打印出来这个对象
可以看到我们创建的这个对象除了创建时设置的一个属性a,还有个自带的属性__proto__
。 接下来看__proto__
的指向,由概念我们得出,obj
的__proto__
指向的是创建obj的对象的prototype
。而var obj = {a:1};
是var obj = new Object({a:1});
的简写。
接下来我们验证一下
我们在Object
的原型对象上创建一个属性b
,通过控制台打印obj
,obj
的__proto__
指向创建他的构造函数Object
的prototype
对象。
接下来我们看Object
的prototype
对象。 prototype
对象中有一个属性constructor
指向的是Object()
自身,他是一个构造函数。
构造函数Object()
也是一个对象,所以他也有自身的__proto__
指向的是创建他的构造函数的prototype
对象。
由图可见,Object()
的__proto__
指向的是Function()
的prototype
对象。(prototype
的constructor
属性指向的是构造函数) 顺着一步步的指向,现在找到了Function
上,接下来看看Function
作为一个对象的__proto__
指向。
可以看到Function
的__proto__
指向的是创建他的构造函数的原型,也就是Function
函数。
而Function
的prototype
对象作为一个对象,他的__proto__
指向的是Object
对象的prototype
属性。
Object.prototype
对象的隐式原型__proto__
指向的是null
,作为一个闭环。
总结: 通过__proto__
一步一步向上找形成的链,我们称之为原型链。 instanceof
这个方法就是通过原型链来查找两个对象是否相同。
例:
我们接着用这个示例来看一下原型链 通过打印son
来看隐式原型__proto__
的指向,son
的隐式原型__proto__
指向的是创建他的构造函数的Parent
的prototype
,而Parent
的原型对象prototype
的隐式原型__proto__
指向的是Object
的显式原型prototype
(我们在上面给Object
的prototype
设置过一个属性b=1
),Object
的prototype
的隐式原型__proto__
指向的是null
,作为原型链的终点。
如果想获取更多内容,可以扫描下方二维码,一起学习,一起进步。