11

我使用 Javascript 采用面向对象的方法,原因有两个。一,因为它可以帮助我学习,二,以防我的代码被分发。

我已经将函数分配给变量并this用于公共变量。但是,我在使用this时遇到了问题。当我在“私有”函数中时,this指的是不同的范围,我无法访问this. 我将说明我的观点。

var ClassObject = function() {
  this.var1 = 'Hello';

  var var2 = 786;

  this.func1 = function() {
    alert(this.var1); // Alerts Hello
    alert(var2); // Alerts 786
  }

  var func2 = function() {
    alert(this.var1); // Alerts undefined
    alert(var2); // Alerts 786
  }
}

我发现授予func2访问权限的唯一方法this.var1是将另一个变量分配给this: var c = this。这是完成这项任务的最佳方式,甚至是被广泛接受的方式吗?有人可以提供更好的解决方案吗?

谢谢你们。

4

3 回答 3

9

是的,这是公认的做法。请参阅有关范围或此问题的这篇文章

阅读关闭也可能会有所帮助。

于 2012-08-08T05:18:14.943 回答
3

的值this由 javascript 解释器在每个函数调用上设置,包括在调用您的私有函数时。规则相当简单:

  1. 如果调用object.method(),则this设置为方法内的对象。
  2. 如果调用一个普通的函数(无论是全局的还是本地的)fn()this设置为全局对象(通常window在浏览器中)。
  3. 当使用.apply()or.call()时,this设置为这些函数的第一个参数(例如,您可以通过传递给.apply()or的内容来控制设置的内容.call()

因此,当你调用你的私有函数时,你会得到选项 2。如果你想访问this你的对象,你有这三个选项:

  1. 使这些私有函数方法(它们将不再是私有的)并将它们作为方法调用它们,就像this.func2()javascript 解释器this为您设置的那样。
  2. 使用.call().apply()喜欢func2.call(this)指示口译员this按照您的意愿进行设置。
  3. 在调用之前将 的值存储this在局部变量中,func1()这样您就可以通过闭包var self = this引用self内部变量。func1()这在 javascript 中很常见(利用闭包允许访问父范围变量的方式)。
于 2012-08-08T05:21:48.213 回答
0

除非您确实使用诸如将其设置为另一个变量之类的东西,否则您将无法做您想做的事情。所以要么重组所有东西,所以你不必这样做,或者只使用变量。我会说使用变量是可以接受的

于 2012-08-08T05:12:23.367 回答