typescript,如何在类中遍历所有实例化的对象?

有个叫animal的类,生成了 cat dog pig 三个实例对象。每个对象有一个布尔值的状态,比如就就status,status默认都是false。现在希望实现这样的功能,类的某个实例对象的状态变成true的时候,其他实例对象的状态都变成false。能不能在animal这个类里统一处理这个事情。

阅读 4.3k
4 个回答
class animal {

private static instances: animal[] = [];

private static changeStatus(instance: animal) {

animal.instances.forEach((item: animal) => {

if (item !== instance) {

item.setStatus(false);

}

})

}

constructor(private status = false) {

animal.instances.push(this);

}

setStatus(status: boolean) {

this.status = status;

}

getStatus() {

return this.status;

}

enableStatus() {

this.setStatus(true);

animal.changeStatus(this);

}

}

const [cat, dog, pig] = [new animal(), new animal(), new animal()];

cat.enableStatus();

console.log(cat.getStatus(), dog.getStatus(), pig.getStatus());

dog.enableStatus();

console.log(cat.getStatus(), dog.getStatus(), pig.getStatus());

pig.enableStatus();

console.log(cat.getStatus(), dog.getStatus(), pig.getStatus());

animal 里塞一个 static instances: animal[] = [],然后 constructor 里塞一句 animal.instances.push(this),之后遍历即可

既然这样要求,那这个属性就不应该是实例的

image.png

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,就需要把指针改成数组了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题