为什么我收到此错误?未捕获的TypeError:state.removeFlag不是函数

时间:2015-05-06 18:49:57

标签: javascript object methods typeerror bitwise-operators

问题

Uncaught TypeError: state.removeFlag is not a function

额外信息

我在使用下面的代码时出现问题,上面给出了错误。我的意图很简单,我想在'class'中设置两个函数然后调用它们,但是我得到了上面的错误,我无法发现问题。我希望另一双眼睛可能有所帮助。我感谢你能给我的任何帮助。

注意: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);

4 个答案:

答案 0 :(得分:2)

您需要在功能中使用 <subsystem xmlns="urn:jboss:domain:ee:1.2"> <spec-descriptor-property-replacement>true</spec-descriptor-property-replacement> <jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement> <annotation-property-replacement>false</annotation-property-replacement> </subsystem> 关键字。另外,我个人更喜欢在对象外移动函数并使用原型...

this

答案 1 :(得分:2)

您正在覆盖状态变量

this.addFlag = function(flag){
    state = (state | flag); // that's the global variable defined outside
}

var state = new State();

state变量不再是该函数的新实例,而是0而是您需要访问this.state而不是

this.addFlag = function(flag){
    this.state = (state | flag); // that's the global variable defined outside
}

答案 2 :(得分:2)

问题是类中的方法正在更改用于保存类实例的全局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;
    }
}

演示:

&#13;
&#13;
// 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);
&#13;
&#13;
&#13;

答案 3 :(得分:1)

你可以尝试这样的事情:

function State(){
    return  {
        state: 0,
        addFlag: function(flag){
            this.state = (this.state | flag);
        },
        removeFlag: function(flag){
            this.state = (~this.state | flag);
        }
    }
}