处理JavaScript类中状态变化的更好方法

处理JavaScript类中状态变化的更好方法,javascript,class,oop,ecmascript-6,redundancy,Javascript,Class,Oop,Ecmascript 6,Redundancy,我正试图从过程性JavaScript转向面向对象JavaScript,我遇到了一个问题,我确信有答案,但我无法解决 目前,我的每个方法都会检查属性的状态,然后根据该状态执行操作。我更愿意做的是更新状态,这些方法将作为状态更改的结果执行。这是可能的,还是我没有抓住重点 以下是我目前拥有的: class ClassExample { constructor({state = false} = {}) { this.state = state; ...

我正试图从过程性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;
        }
    }
}
以及:


由于两种方法都在检查相同的属性,因此会产生大量冗余的
if
语句。有没有更好的方法来组织这个
以获得相同的结果?

我建议您使用基于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);

除了
state
,您还有其他可变字段吗?@RandallFlagg是的,为了清晰起见,我已将此示例配对。请使用es6/5proxies@robertotom与
get
set
中一样,
has
etc?变化检测是现代框架的主要关注点之一,可以用几种完全不同的方式来解决。在您的示例中,方法和
状态
之间的关系尚不清楚。为什么首先要在方法调用时切换它?该问题是否假定它始终处于切换状态?一个实际的例子来解释你想做什么可能会有所帮助。
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);