在JavaScript类中处理状态更改的更好方法

时间:2017-11-16 15:34:07

标签: javascript class oop ecmascript-6 redundancy

我试图从程序化的JavaScript转向面向对象的JavaScript,而且我遇到了一个问题,我确信它有答案,但我可以'解决它。

目前,我的每个方法都会检查属性的状态,然后根据该状态执行操作。我宁愿做的是更新状态,这些方法由于状态改变而执行。这可能吗,还是我错过了这一点?

这是我目前所拥有的:

class ClassExample {
    constructor({state = false} = {}) {
        this.state = state;
        ...
    }

    aMethod() {
        if(this.state) {
            //Do something
            this.state = false;
        } else {
            //Do something else
            this.state = true;
        }
    }

    bMethod() {
        if(this.state) {
            //Do something
            this.state = false;
        } else {
            //Do something else
            this.state = true;
        }
    }
}

const myObject = new ClassExample();
myObject.aMethod();
myObject.bMethod();

鉴于两种方法都在检查相同的属性,它会产生大量冗余的if语句。是否有更好的方法来组织此class以获得相同的结果?

1 个答案:

答案 0 :(得分:2)

我建议您使用基于node.js中内置的EventEmitter()对象的事件驱动系统。

要跟踪状态变化,您可以为状态变量定义一个setter,这样每当有人设置一个新状态时,您的setter函数就会被调用,然后它可以触发一个指示状态发生变化的事件。同时,对象外的任何人都可以注册一个事件监听器来进行状态更改。

这是一个简短的例子:

const EventEmitter = require('events');

class ClassExample extends EventEmitter {
    constructor(state = 0) {
        super();
        // declare private state variable
        let internalState = state;
        // define setter and getter for private state variable
        Object.defineProperty(this, "state", {
            get: function() {
                return internalState;
            },
            set: function(val) {
                if (internalState !== val) {
                    internalState = val;
                    // send out notification 
                    this.emit("stateChanged", val);
                }
            }
        });
    }
}

let e = new ClassExample(1);
console.log(e.state);

e.on("stateChanged", function(newVal) {
    console.log("state has changed to ", newVal);
});

e.state = 3;
console.log(e.state);