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);
答案 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;
}
}
演示:
// 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;
答案 3 :(得分:1)
function State(){
return {
state: 0,
addFlag: function(flag){
this.state = (this.state | flag);
},
removeFlag: function(flag){
this.state = (~this.state | flag);
}
}
}