目的
理清楚 __proto__,prototype,Object.getPrototypeOf/Object.setPrototypeOf,以及继承与原型间的关系
简介
__proto__,只有对象才有的属性,即原型,不建议直接通过__proto__获取,建议通过Object.getPrototype获取。根据ECMAScript标准,使用someObject.[[Prototype]]符号指代someObject的原型- 原型链是通过
[[Prototype]]不断向上连接 prototype,只有函数才有的属性,默认为空对象{}。对象也可以手动设置其值,但跟普通的键没区别Object.setPrototypeOf(A, B),将A的原型设置为B,等价于A.__proto__ = BObject.getPrototypeOf(A),获取A的原型的标准方法- 当原型不为
null时,等价于A.__proto__ - 当原型为
null时,通过obj.__proto__获取到的值为undefined,但通过Object.getPrototypeOf(obj)获取到的指为null
- 当原型不为
__proto__可以直接设置对象字面量的原型
1 | let pro = { |
图解
- 说明:
Shape是父类,Triangle是子类,Triangle继承自Shape。图中所有的__proto__均指通过Object.getPrototype获取得到的原型 - 注意:当通过
extend继承时,Triangle.prototype.__proto__ === Shape.prototype,当通过setPrototypeOf方法继承时,Triangle.prototype.__proto__ === Object.prototype
