JS 中 .__proto__ 与 .prototype 的关系与区别
简要说明如下:
-
.__proto__
是对象的属性;.prototype
是构造函数的属性。 -
两者的值都是原型对象。也就是说,两者的作用都是获取对象的原型对象。
-
对于由构造函数创建的对象来说,
o.__proto__ === o.constructor.prototype
——这是两者最直接的关联。 -
对于 “对象字面量” 和由
Object.create(proto)
创建的对象来说,o.constructor === Object
。 -
对于由
Object.create(null)
创建的对象来说,没有.constructor
,也就获取不到.constructor.prototype
。但可以通过.__proto__
来获取它的原型(null
)。
补充说明
.__proto__
原本是浏览器实现的私有属性,并不是语言标准。ES6 把这个属性标准化了,但在后来的版本中又弃用了,因此我们应该用以下方法代替它:
- Getter:
Object.getPrototypeOf(o)
- Setter:
Object.setPrototypeOf(o, proto)