Javascript继承-原型的陷阱
这篇讲的是JavaScript原型继承中一个经典的“实例属性共享陷阱”。作者从一个简单的Widget父类和SubWidget子类出发,展示了当使用`SubWidget.prototype = new Widget()`设置继承后,所有子类实例会意外地共享同一个`messages`数组——比如给sub1和sub2分别push消息,结果它们的数组内容完全相同。 问题的根源在于,通过`new Widget()`创建的原型对象中,`messages`数组只初始化了一次,所有实例都指向原型上的同一份数据。作者用清晰的对象关系图逐步揭示了这一过程:原型上的共享属性,如何在实例操作时相互影响。 解决方法是在子类构造函数中调用`Widget.apply(this, arguments)`,借用父类构造函数在每个实例的上下文中初始化属性。文章还补充了两点优化:调整调用顺序以避免子类属性被覆盖,以及直接使用`SubWidget.prototype = Widget.prototype`避免父类构造函数重复执行。这些细节让这个“踩坑-解坑”的过程更具实操参考价值。