【问题标题】:Change "this" to a variable name within name space将“this”更改为命名空间中的变量名
【发布时间】:2016-04-08 06:06:53
【问题描述】:

我正在做一个需要使用名称空间来完成的项目。当我需要将“this”更改为实际时,我很难让它工作 变量名。

因此。

我创建了一个名称空间 $work。 然后是一个名为 $work.Guess 的类(然后我将其重命名为“游戏”) 然后是一个名为point的方法。 (该方法从 onclick 按钮触发)

我试图将“this”更改为其他内容。在我看来,它应该是 game.point,但这不起作用。所以我然后尝试使用“var point”。他们都没有处理按钮的 onclick 事件。然后,我尝试使用我认为可以代替“this”的每个名称来使用该方法。失败。

这是一个示例代码。

var $work = {};
$work.Guess = function() {

  this.point = function() {
    alert('found' + " " + 'point');
  }

}

var game = new $work.Guess;
<form name="foo">
  <h2>Check scores</h2>
  <input type="button" value="Check points" onclick='game.point();' />
  <br />
</form>

【问题讨论】:

  • 这里有什么问题?你只有一段告诉我们你尝试了什么,但不是真正的问题。 “我试图将“this”更改为其他内容” - 为什么?如何?我们在代码中看不到这一点。
  • 不应该是var game = new $work.Guess()吗?
  • sn-p 工作了吗?我没有看到问题/错误。

标签: javascript class namespaces this


【解决方案1】:

您想在这里摆脱this 是对的。以这种方式向对象添加实例方法是一种浪费,因为它会为每个对象创建一个新的函数副本。在 Javascript 中,“类方法继承”(传统上称为)是通过原型完成的:

$work.Guess = function () { };
$work.Guess.prototype.point = function () {
    alert('found point');
};

var game = new $work.Guess();
game.point();

如果不在这里指出更好的ES6 class syntax,我会很遗憾。

【讨论】:

  • 我更喜欢这个解决方案。我正要发布它,但我有点AFK。我发现大部分时间(如果不是所有时间)方法都属于原型。
【解决方案2】:

试试这个

var $work = {};
$work.Guess = {
    point: function() {
        alert('found' + " " + 'point');
    }
};

var game = $work.Guess;

更新:

不知道反对票是为了什么。无论哪种方式,上述工作都很好。

<form name="foo">
  <h2>Check scores</h2>
  <input type="button" value="Check points" onclick='game.point();' />
  <br />
</form>

【讨论】:

  • 您的解决方案基本上是 OP sn-p,只是语法不同。
  • 原版也可以正常工作。 game 将有一个公共方法 .point(),因为这是在构造函数中添加的。
  • 我也不理解反对票,OP 的问题是如何将代码更改为不使用 this 的代码,而这正是您所做的。给我点赞。
  • @deceze 这是一个很好的观点。我想你可以用Object.assign 复制它。
  • 感谢您的回复。我知道它正在工作。我不想使用“this”的原因是我稍后会稍微复杂一点。我真的不太确定名称空间或“this”的使用。
猜你喜欢
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2015-03-03
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
相关资源
最近更新 更多