ecomfe / oo

Base library for OO style programming
MIT License
5 stars 5 forks source link

Object.setPrototypeOf与oo生成的class冲突 #36

Closed otakustay closed 8 years ago

otakustay commented 8 years ago

示例代码:

let Super = oo.create({});
let Sub = function () {};
Object.setPrototypeOf(Sub, Super);
Sub.toString(); // StackOverflow

原因分析:

  1. oo创建class时会赋值kclass.toString
  2. toString的实现实际上是this.prototype.constructor.toString()
  3. Object.setPrototypeOf会让Sub.toStringSuper.toString相同
  4. Sub.prototype.constructor其实就是Sub自身
  5. 因此toString()会导致死循环

更进一步:

这个问题不仅仅存在于setPrototypeOf上,当一个“继承”函数同时满足以下条件:

  1. 会修正prototype.constructor为自身
  2. 会把静态方法都继承过来

的情况下,这个toString()就会导致死循环