译文
特别的__proto__属性提供了Object.getPrototypeOf方法所没有的额外功能:修改对象的原型链。虽然看似无害,但是这个隐形的功能是必须要避免使用的。一个非常明显的原因就是:当你要通过这种方式修改原型链的时候,这种方式却不被支持。
另外的原因还有性能关系。所有的现在JavaScript引擎都对设置和获取对象属性进行了着重的优化,因为这属于是最常用的一些操作。这些优化完全基于引擎对对象结构的认知。当改变了对象的内部结构之后,在对象本身以及其原型链上添加和删除属性时,这些优化都将是无效的。修改对象本身的继承结构是极具破坏性的。
但是避免修改__proto__最重要的原因是要维护我们可以预测的行为。对象的原型链通过其属性和属性的值来定义行为。修改对象的原型链就像是给它做了一个大脑移植手术:交换了整个继承关系的层级。可能在某些例外情况下,这样的做法是有帮助的,但是最为明智的选择还是需要保证继承层级的稳定性。
想要为对象自定义原型链,可以使用ES5当中的Object.create方法。
Things to remember
- 永远不要修改__proto__属性。
- 使用Object.create方法实现继承。