我们今天来聊聊寄生组合式继承,这其实是 JavaScript 里最好的继承方法。在之前提到的组合继承里,有个大问题:子类其实不是父类的实例。比如用 instanceof 检查时,它只能说明子类的原型链上有父类,可你要是直接拿子类去找父类的方法,那是不行的。寄生组合式继承就是为了解决这个麻烦而出现的。它的核心想法是借用 Object.create 来完成原型寄生,不用再手动写那堆复杂的 inheritObject() 了。 这样做能直接把父类原型“克隆”一份给子类,而且不需要改动子类的构造函数。这样一来,子类就既是构造函数的实例,也是父类的实例,问题就全解决了。 来看代码怎么写。第一步,先定义个 SuperClass,它有个 getName 方法。第二步是定义 SubClass,这里要调用 SuperClass.call 来借用父类的构造函数,还得给它添加自己的属性。第三步也是关键一步,得用 Object.create 把父类原型复制一份,挂到子类原型上。最后再把子类原型上的 constructor 指回子类自己。 比如像这样定义完之后,SubClass 就同时拥有了 SuperClass 的属性和方法,而且不会像组合继承那样重复调用父类构造函数。这个办法最大的好处有两个:一是只实例化一次父类,省了内存开销;二是完全兼容 instanceof,怎么检查都通得过。 不过你在使用的时候要小心别把原型当普通对象来用。如果直接用点语法给 SubClass.prototype 赋值,很容易就把刚才借来的那份父类原型给覆盖了。要是想再扩展新方法,必须得显式地写 SubClass.prototype.xxx = function() {},别忘记加这个点符号才行。说到底这招就是“借用构造函数 + 浅拷贝父类原型”的结合体。 寄生组合式继承一次性干掉了“子类不是父类实例”和“重复实例化”这两大痛点,绝对是 JavaScript 面向对象编程里最干净、最高效的方案。只要你学会了它,写起类来就更高效也更省心了。