面试题答案
一键面试架构设计思路
- 区分静态与实例成员:
- 静态成员:适用于那些与类本身相关,而不是与类的具体实例相关的属性和方法。例如,全局配置、工具方法等。多个实例不需要各自持有一份这些数据或逻辑,这样可以节省内存。
- 实例成员:用于每个实例特有的数据和行为。例如,每个用户实例可能有不同的登录状态、个性化设置等。
- 提高可维护性:
- 静态成员:将通用的功能和数据放在静态成员中,一处修改,处处生效。例如,项目中有一个格式化日期的工具方法,将其定义为静态方法,所有需要格式化日期的地方都调用这个静态方法,若格式化规则改变,只需修改一处。
- 实例成员:清晰地将每个实例的特有数据和行为分离,使代码结构更清晰,便于理解和维护。
- 提高可扩展性:
- 静态成员:可以方便地在类层次结构中进行继承和扩展。例如,基类的静态配置可以被子类继承并根据需求修改,为新的功能扩展提供基础。
- 实例成员:每个实例的扩展不影响其他实例,增加新的实例成员可以轻松实现新的功能特性。
- 性能优化:
- 静态成员:由于只存在一份,访问静态成员不需要创建类的实例,减少了内存开销和创建实例的时间消耗。对于频繁使用且不依赖实例状态的功能,使用静态成员更高效。
代码示例
// 定义一个基类
class BaseService {
// 静态属性,存储全局配置
static globalConfig: { apiUrl: string } = { apiUrl: 'https://example.com/api' };
// 静态方法,用于格式化日期
static formatDate(date: Date): string {
return date.toISOString();
}
// 实例属性,每个实例特有的数据
instanceData: string;
constructor(data: string) {
this.instanceData = data;
}
// 实例方法,操作实例特有的数据
printInstanceData() {
console.log(`Instance data: ${this.instanceData}`);
}
}
// 子类继承自BaseService
class SubService extends BaseService {
// 子类可以修改静态属性
static globalConfig: { apiUrl: string } = { apiUrl: 'https://sub - example.com/api' };
constructor(data: string) {
super(data);
}
// 子类可以扩展实例方法
enhancedPrint() {
console.log(`Enhanced: ${this.instanceData}`);
}
}
// 使用示例
// 访问静态属性和方法,不需要创建实例
console.log(BaseService.globalConfig.apiUrl);
console.log(BaseService.formatDate(new Date()));
// 创建实例并访问实例成员
const baseInstance = new BaseService('Base Data');
baseInstance.printInstanceData();
const subInstance = new SubService('Sub Data');
subInstance.printInstanceData();
subInstance.enhancedPrint();
console.log(SubService.globalConfig.apiUrl);
在这个示例中,通过合理使用static
关键字定义静态成员,实现了全局配置和通用工具方法的集中管理,提高了可维护性和性能。实例成员清晰地定义了每个实例特有的数据和行为,便于扩展和理解。子类通过继承和重写静态及实例成员,进一步展示了可扩展性。