首先,用一张图来总结这三者的关系:
__proto__
js中每一个对象都含有一个内置属性_proto_
。
它的作用在于:当我们在访问一个对象obj
中的某一属性时,如果在obj
中找不到这一属性,就会沿着_proto_
一直寻找,直到_proto_
值为null
。这样就构成了原型链。
对于_proto_
的指向,我们可以根据对象定义方式的不同分为三种情况来讨论:
(1)使用字面量创建的对象
|
|
对于使用字面量来创建的对象,它的_proto_
直接指向这一字面量的prototype
。
|
|
补充说明String.prototype
(即字面量原型)的__proto__
的指向,因为String.prototype
也是一个对象,所以它的__proto__
指向的是Object.prototype
。
(2)使用new
方式创建对象
第一种情况:
|
|
第二种情况:
|
|
(3) 使用Object.create(...)
方式创建对象
|
|
对于上面的结果你可以这么理解,让我们看看一个Object.create(Obj)
是怎么工作的:
|
|
所以bar
指向的是函数Obj
本身。
对于__proto__
这一方法在ES5中才被标准化为传统功能,为了更好的保证web浏览器的兼容性,建议只使用Object.getPrototypeOf()
。
prototype
除了Function.prototype.bind
方法构造出来的函数,其他函数都有一个prototype
属性。这个属性指向函数的原型对象。
|
|
constructor
存在于原型对象上,此属性的值是对函数本身的引用,而不止是一个字符串。
|
|
__proto__
和prototype
的区别
1.对象有属性__proto__
,指向该对象的构造函数的原型对象。
2.方法除了有属性__proto__
,还有属性prototype
,prototype
指向该方法的原型对象。