javascript - 为什么我会收到此错误?未捕获的类型错误: state.removeFlag不是函数

标签 javascript object methods typeerror bitwise-operators

问题

未捕获的类型错误:state.removeFlag 不是函数

额外信息

我在使用下面的代码时遇到问题,导致出现上面的错误。我的意图很简单,我想在“类”中设置两个函数然后调用它们,但是我收到上述错误,并且无法发现问题。我希望另一双眼睛能有所帮助。我感谢您能给我的任何帮助。

注意:Flags.CROSS_SLOT 的值为 1

代码

function State(){
    this.state = 0; //bitstring representing the user's choices in the UI

    this.addFlag = function(flag){
        state = (state | flag);
    }

    this.removeFlag = function(flag){
        state = (~state | flag);
    }
}

var state = new State();

state.addFlag(Flags.CROSS_SLOT);
console.log(state.state);
state.removeFlag(Flags.CROSS_SLOT);
console.log(state.state);

最佳答案

问题在于类中的方法正在更改用于保存类实例的全局 state 变量,而不是更改类中的属性。第一次调用会覆盖该变量,因此第二次调用会失败,因为该变量不再包含该对象。

Javascript 没有对象作用域,因此在方法内使用 state 标识符并不意味着对象中的 state 属性。您需要使用 this 关键字来访问对象中的成员。

此外,使用 & 运算符删除标志并将 ~ 运算符应用于该标志,否则您将翻转所有标志并添加您尝试添加的标志删除。

function State(){
    this.state = 0; //bitstring representing the user's choices in the UI

    this.addFlag = function(flag){
        this.state = this.state | flag;
    }

    this.removeFlag = function(flag){
        this.state = this.state & ~flag;
    }
}

演示:

// function to show values in StackOverflow snippet
function log(s) { document.write(s + '<br>'); };


function State(){
    this.state = 0; //bitstring representing the user's choices in the UI

    this.addFlag = function(flag){
        this.state = this.state | flag;
    }

    this.removeFlag = function(flag){
        this.state = this.state & ~flag;
    }
}

var state = new State();

var Flags = {
  CROSS_SLOT: 1
};

state.addFlag(Flags.CROSS_SLOT);
log(state.state);
state.removeFlag(Flags.CROSS_SLOT);
log(state.state);

关于javascript - 为什么我会收到此错误?未捕获的类型错误: state.removeFlag不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30085182/

相关文章:

javascript - 从 javascript 加载和缓存脚本

Java - 定义用于创建对象的行,而不是仅使用方法

javascript:检查对象是否具有特定元素或属性的最佳方法?

java - 为什么我输入的内容总是被保存?

c++ - 如何避免这种内存泄漏?

javascript - 无法再次请求全屏 chrome

javascript - nodejs中这两个异步函数有什么区别?

javascript - 正则表达式 如何查找 match() 之前的特定字符?

c++ - 删除通过取消引用新对象初始化的对象

python - 如何检查Python中是否存在方法?