知识卡片

原型链子类化的固定范式

专业/工作 · 416.b

内容

在ES6 class语法出现之前,用原型链手工实现继承要固定完成三件事,缺一不可:第一,把子类的prototype替换成一个”继承自父类prototype”的新对象(而不是直接等于父类prototype,否则子类和父类会共享同一个原型、互相污染),即constructor.prototype=inherit(superclass.prototype);第二,替换prototype会连带丢失默认的constructor反向引用,必须手动修回constructor.prototype.constructor=constructor;第三,子类构造函数要用superclass.apply(this,arguments)把父类构造函数当普通函数调用一遍,让父类的初始化逻辑也在this上跑一遍,子类方法若要扩展而非替换父类同名方法,则用superclass.prototype.method.apply(this,arguments)显式调用父类版本。这套繁琐的手工范式解释了为什么ES6要专门发明class/super语法糖——它精确地封装了这三步,而不是发明了新的继承模型。

参考来源

《JavaScript权威指南(原书第6版)》第9章《类和模块》