继承与组合都是面向对象中代码复用的方式,了解各自有什么特点,可以让我们写出更简洁的代码,设计出更好的代码架构。
“我应该怎么使用继承和组合”这是一个常见的问题,不仅是JavaScript相关,但是本篇我们只讨论JavaScript相关的内容和示例。
如果你不知道什么是组合或继承,我强烈推荐你去查看相关内容,因为本文的主要讲的就是怎么使用和如何选择它们,但是为了确定我们在一个频道,让我们先了解一下组合和继承吧。
继承是面向对象编程核心概念之一,可以帮助我们避免代码重复。主要的思想是我们可以创建一个包含逻辑的基类,可以被子类重用。我们来看个示例:
class Element {
remove() {}
setStyles() {}
}
class Form extends Element {}
class Button extends Element {}
我们创建了一个基类“Element”,子类会继承Element中的通用逻辑。
继承存在is-a关系:Form
是一个Element
, Button
也是一个Element
。
组合:和继承不同,组合使用的是has-a关系,将不同的关系收集到一起。
class Car {
constructor(engine, transmission) {
this.engine = engine;
this.transmission = transmission;
}
}
class Engine {
constructor(type) {
this.type = type;
}
}
class Transmission {
constructor(type) {
this.type = type;
}
}
const petrolEngine = new Engine('petrol');
const automaticTransmission = new