【问题标题】:Can't change a class variable within javascript function无法更改 javascript 函数中的类变量
【发布时间】:2013-11-12 12:52:20
【问题描述】:

方法,foo() 被调用,sx++ 不会改变。当我alert(sx) 我得到 NaN。我应该使用原型定义方法吗?

function fooClass(sx) {
    this.sx = sx;
    this.foo = function() {
      if(booleanIsTrue) this.sx++;
    };
}

*忽略语法错误,如果有的话。这不是复制粘贴。在我的项目中是正确的。

sx++ 移到if 语句之外。

关于为什么会发生这种情况的任何想法?

【问题讨论】:

  • 因为sx 不是this.sx ...?
  • 哎呀,那是我打字的错误。固定。
  • “将 sx++ 移到 if 语句之外” – 比 if 条件不评估为 true ...?
  • @CBroe 这是可能的,当我回到我的项目计算机时我会测试它。
  • booleanIsTrue 定义在哪里?

标签: javascript if-statement increment


【解决方案1】:

正如你所说,这看起来像是你想要使用prototype chain 而不是为函数创建的每个对象创建新函数的情况。应该是这样的

var FooClass = function (sx) {
    this.sx = sx;
};

FooClass.prototype.foo = function () {
  if (booleanIsTrue) { //Where is booleanIsTrue coming from?
    this.sx++; 
  }
};


var a = new FooClass(0);
a.foo();
console.log(a.sx); //1

【讨论】:

  • 对不起,你错了,this 值是调用对象,由于 OP 没有包含函数的调用方式,我们看不到 this 是什么.函数 foo 是 fooClass 实例的成员(在 fooClass.prototype 上会更好,但出于其他原因),所以我们假设它是用 fooClassInstance.foo(); 调用的,调用对象将是 fooClassInstance ,它也有一个 this.sx 成员。 stackoverflow.com/a/16063711/1641941 在“这个变量”下
  • 你是对的,它确实取决于调用函数的方式,callapply 的使用,但我假设你说它是用fooClassInstance.foo() 调用的。我可以看到如何说函数具有隐式 this 而没有说明它是调用对象是不够清楚的。我会解决的。
  • 我不完全遵循答案的第一部分,但同意在原型上定义函数。即使这不会解决 OP 的问题,因为他/她表示删除 if 语句会使其表现得像 OP 预期的那样。如果我要使用作为 OP 提供的代码执行 var inst=new fooClass();inst.foo(); 而不是 foo 函数内的 this 将是 inst 而不是窗口。
  • 哦,你是对的,我把函数放在变量中,而不是在我的回答中将它附加到this
【解决方案2】:

您遇到此问题是因为您添加了错误的变量。您想更改类变量 sx。

正如有人指出的,class 是一个保留字,通常你使用 klass 来代替。

另外,您应该使用 {},尝试将您的代码输入 JSLint 并查看它返回的内容。

试试这个:

function klass(sx) {
    this.sx = sx;
    this.foo = function(booleanIsTrue) {
      if(booleanIsTrue === true) {
        this.sx++;
      }
    };
}

var a = new klass(3);
a.foo(true);
console.log(a.sx); // 4

【讨论】:

  • 你有什么改变吗? oO
  • 我添加了一些代码来实例化类和现在所有的东西,试试吧!
  • 我会尝试实例化它,但它不应该在方法中记录。我需要在方法中更改this.sx,以便以不同的方式更改this.render() 对象。都在课堂上。
  • 方法内登录?
猜你喜欢
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多