寄生组合式继承就用subclass. prototype

给个例子,在写Class和SubClass的时候,用组合继承会让SubClass不是父类实例,这样就没办法用instanceof来验证了。比如,我们想把SubClass做成SuperClass的实例,那这种尴尬就没法解决。 为了解决这个问题,寄生组合式继承就派上用场了。这个方法的思路很简单,利用Object.create来“克隆”父类原型,直接把这个克隆的原型赋给SubClass.prototype,并且修复constructor指向。 把这个过程分成三步: 第一步,定义父类SuperClass和它的原型方法getName。 第二步,定义子类SubClass,并用SuperClass.call来调用父类的构造函数,给它的name属性赋值。 第三步,创建一个继承函数inheritPrototype,在里面用Object.create复制SuperClass.prototype,然后把这个副本赋值给SubClass.prototype。 最后还需要修复一下SubClass.prototype.constructor,让它指向SubClass自己。这个步骤非常重要。 通过这种方法,SubClass同时拥有了SuperClass的方法和属性。而且和组合继承相比,这个方法只调用一次父类的构造函数,避免了重复实例化的开销。 用这种方法定义出来的SubClass既是构造函数实例,又是父类实例。所以在代码中使用的时候可以直接访问父类的方法。 和普通的继承方式相比,寄生组合式继承最大的好处是高效和干净。它一次性解决了“子类不是父类实例”和“重复实例化父类”这两个问题。如果你需要在JavaScript中编写面向对象的代码,掌握这种继承方式非常重要。 不过在使用的时候要注意,不要把原型当成普通对象来操作。如果直接给SubClass.prototype赋值的话,就会把之前复制过来的父类原型覆盖掉。所以在添加新方法的时候,一定要显式地写SubClass.prototype.新方法的形式。 简单来说,寄生组合式继承就是通过“借用构造函数”和“浅拷贝父类原型”这两个操作实现的高效继承方式。这也是目前JavaScript面向对象编程中最常用、最高效的一种方案。