面试题答案
一键面试可能存在的问题
- 属性直接暴露:
Animal
类中的health
属性直接在构造函数中定义,没有任何访问控制,这意味着在类外部可以随意访问和修改该属性,比如可能出现恶意代码直接将health
设置为负数,破坏对象的状态。
改进措施
- 使用ES6的#私有字段:在
Animal
类中,将health
属性改为私有字段,如下:
class Animal {
#health = 100;
constructor() {}
getHealth() {
return this.#health;
}
setHealth(value) {
if (typeof value === 'number' && value >= 0 && value <= 100) {
this.#health = value;
} else {
throw new Error('Invalid health value');
}
}
}
class Dog extends Animal {
constructor(name) {
super();
this.name = name;
}
}
这样,health
属性在类外部无法直接访问和修改,只能通过getHealth
和setHealth
方法来操作,在setHealth
方法中可以添加对health
值的验证逻辑,增强安全性。