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)