有个叫animal的类,生成了 cat dog pig 三个实例对象。每个对象有一个布尔值的状态,比如就就status,status默认都是false。现在希望实现这样的功能,类的某个实例对象的状态变成true的时候,其他实例对象的状态都变成false。能不能在animal这个类里统一处理这个事情。
有个叫animal的类,生成了 cat dog pig 三个实例对象。每个对象有一个布尔值的状态,比如就就status,status默认都是false。现在希望实现这样的功能,类的某个实例对象的状态变成true的时候,其他实例对象的状态都变成false。能不能在animal这个类里统一处理这个事情。
往 animal
里塞一个 static instances: animal[] = []
,然后 constructor
里塞一句 animal.instances.push(this)
,之后遍历即可
既然这样要求,那这个属性就不应该是实例的
class Animal{
static status = false;
constructor(name) {
this.name = name
}
get status() {
return Animal.status
}
set status(status) {
return Animal.status = !!status
}
}
cat = new Animal('cat');
dog = new Animal('dog');
pig = new Animal('pig');
console.log(cat, dog, pig)
console.log(cat.status, dog.status, pig.status)
cat.status = true
console.log(cat.status, dog.status, pig.status)
dog.status = false
console.log(cat.status, dog.status, pig.status)
console.log(cat, dog, pig)
一二楼方案的简化:该静态属性改为一个指针,默认指向 null
,有实例对象状态为 true
的时候指向该实例对象,甚至实例对象不需要 state
,因为判断该指针是否指向实例就知道 state
了:
class Animal{
static current:null|Animal = null;
setState(state: boolean = false): Animal{
if(state){
Animal.current = this;
} else if(Animal.current === this){
Animal.current = null;
}
return this;
}
getState(): boolean{
return Animal.current === this;
}
}
我 TS 学得稀烂,将就着看把,大致意思应该还算明了。
当然,这样做的可扩展性不佳,万一哪天允许多个实例状态为 true
,就需要把指针改成数组了。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决