【问题标题】:What is this() in javascript?javascript中的this()是什么?
【发布时间】:2019-02-19 08:14:54
【问题描述】:

我了解 javascript 中的 this 关键字。我像this.method()this.variable = 一样使用它。但这是什么()。见以下代码:

  static fromTX(tx, index) {
    return new this().fromTX(tx, index);
  }

请帮助我理解 this() 在 javascript 和上述代码示例中的用法。

【问题讨论】:

标签: javascript this


【解决方案1】:

在静态方法中,this 将引用构造函数,因此new this() 将调用构造函数:

class Foo {
  constructor() {
    console.log('making instance');
  }
  static makeFoo() {
    return new this();
  }
}

const f = Foo.makeFoo();

当然,像这样调用this 只有在this 引用一个函数时才有可能,否则会抛出错误。 通常this 将引用一个对象,而不是一个函数。

【讨论】:

  • 只是为了添加一些东西,要理解为什么“this”指的是构造函数,咨询编译器的编译代码(如 tsc)可能会有很大帮助:typescriptlang.org/play/…
  • @briosheje 根本不需要那么复杂。当您调用Foo.makeFoo() 时,this 指的是Foo。时期。就这么简单。由于new Foo 有效,new this 也有效。
  • @deceze 通常,据我所知,在许多其他 OOP 语言(例如 C#)中,静态方法中的 this 不存在。对我来说,看看它是如何在 vanilla JS 中转换的,可以更容易理解为什么 this 实际存在,不是吗?
  • @briosheje 如果您需要重新调整自己以适应其他语言……好吧。但是 Javascript 中的规则非常简单,应该按照自己的术语来看待:如果通过 a.b() 调用,b 内部的 thisa。这适用于任何类型的对象。 (从这里你可以分支到显式绑定以及在 c() 等情况下会发生什么......)
  • @deceze 是的,我应该提到上面的评论更有可能是任何习惯于其他语言的人的参考。我只是觉得它可能很有用,因为在许多其他语言中,static 关键字使this 不可用,特别是在那个例子中,如果你不知道 javascript 是如何工作的,它只是看起来......错了。无论如何,这只是一个评论,可以为那些从“技术”概述中以某种方式想为什么在这种情况下存在这种情况的人添加一些有用的东西。无论如何,正如您提到的那样,指向主要规则要容易得多。
【解决方案2】:

让我们采用两种方法来解决这个问题:
首先this 指的是类中的当前实例,并且是多种语言中的关键字。
@ 987654322@是对构造函数的调用,它也可以包含各种参数。

第二,看代码sn-p,它是一个静态方法——恰好是一个静态工厂方法。查看它以了解使用它的原因和位置以及更多详细信息。

sn-p 提供了一个 API 来从参数tx, index 创建类对象。您可能希望这样做以使其对调用此 API 的客户端更具可读性。可以安全地假设您可能在此方法中也有不同的 API,仅用于创建类的对象。此外,在这种情况下,构造函数被标记为私有,以获得对对象实例化的更多控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2011-06-20
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多