Page 180 - 你不知道的JavaScript(上卷)
P. 180
6.1 面向委托的设计
为了更好地学习如何更直观地使用 [[Prototype]],我们必须认识到它代表的是一种不同
于类(参见第 4 章)的设计模式。
面向类的设计中有些原则依然有效,因此不要把所有知识都抛掉。(只需要
抛掉大部分就够了!)举例来说,封装是非常有用的,它同样可以应用在委
托中(虽然不太常见)。
我们需要试着把思路从类和继承的设计模式转换到委托行为的设计模式。如果你在学习或
者工作的过程中几乎一直在使用类,那转换思路可能不太自然并且不太舒服。你可能需要
多重复几次才能熟悉这种思维模式。
首先我会带你们进行一些理论训练,然后再传授一些能够应用在代码中的具体实例。
6.1.1 类理论
假设我们需要在软件中建模一些类似的任务(“XYZ”、“ABC”等)。
如果使用类,那设计方法可能是这样的:定义一个通用父(基)类,可以将其命名为
Task,在 Task 类中定义所有任务都有的行为。接着定义子类 XYZ 和 ABC,它们都继承自
Task 并且会添加一些特殊的行为来处理对应的任务。
非常重要的是,类设计模式鼓励你在继承时使用方法重写(和多态),比如说在 XYZ 任务
中重写 Task 中定义的一些通用方法,甚至在添加新行为时通过 super 调用这个方法的原始
版本。你会发现许多行为可以先“抽象”到父类然后再用子类进行特殊化(重写)。
下面是对应的伪代码:
class Task {
id;
// 构造函数 Task()
Task(ID) { id = ID; }
outputTask() { output( id ); }
}
class XYZ inherits Task {
label;
// 构造函数 XYZ()
XYZ(ID,Label) { super( ID ); label = Label; }
outputTask() { super(); output( label ); }
}
行为委托 | 165