【问题标题】:Why does TypeScript need the "this." prefix for "internal" modules?为什么 TypeScript 需要“this”。 “内部”模块的前缀?
【发布时间】:2016-05-31 15:01:14
【问题描述】:

在 TypeScript 中定义模块有两种方式:

“单身”生活方式:

import app = require("durandal/app");
import ko = require("knockout");

export var name = ko.observable();

export function sayHello() {
    app.showMessage('Hello ' + name() + '! Nice to meet you.', 'Greetings');
}

“短暂”的生活方式:

import app = require("durandal/app");
import ko = require("knockout");

class AnythingYouLike {
    name = ko.observable();

    sayHello() {
        app.showMessage('Hello ' + this.name() + '! Nice to meet you.', 'Greetings');
    }
}

export = AnythingYouLike;

我用引号作为我的名字来定义模块的这些不同方式,因为我无法弄清楚“官方”名称是什么。

使用“transient”样式,尤其是在使用像Durandal 这样的框架时,是很有意义的,因为您可以更好地控制视图模型模块的生活方式并避免尴尬的错误。一个缺点是您必须在任何地方都使用“this”,这有两个问题:

  1. 将模块从一种样式更改为另一种样式很乏味。
  2. 到处都是this. 很吵。

为什么实际上需要使用this.,为什么两种样式都不需要?

【问题讨论】:

  • 你不是在 Transient 风格的类的上下文中与 Singleton 风格的函数相反吗?在类上下文中调用 this. 在 OOP 中很常见,对吧?提前道歉。我可能会想念你的问题。
  • 是的,除了大多数语言允许它是隐式的,我不明白为什么它不能在这里。
  • 哇,我的问题被否决了。我想知道为什么。如果可以的话,我很乐意改进它。
  • 您的问题中似乎没有任何内容涉及 AMD 模块。您可能希望改进您​​的问题标题。

标签: javascript typescript durandal amd


【解决方案1】:

这与模块无关,因为在第二个“样式”中,nameAnythingYouLike 的成员,而在第一个“样式”中“样式”您将其声明为全局空间中的自变量。

this 在前一种情况下是有意义的,当您意识到该类的特定实例正在使用它来引用它自己的name - this.name,阅读:“我的名字”。

当然,在第一个示例中没有这样的上下文 - 在那里,您只是在创建 name

@War10ck 指出这是一个非常基本的 OOP 事情是正确的。

回应您的评论:

但是在第二个例子中,上下文(周围的类声明)应该意味着这个。可以暗示,不是吗?

Java 以这种方式工作(与其他 OOP 语言一样),this 的语义在 TS 和 Java 中或多或少相同。但是不,this 不能在 TS 中隐含,它必须是明确的。

请注意,这主要是因为“单例样式”存在于 JS 中,因此在 TS 中存在扩展,而在 Java 中则不存在。为了说明,考虑一下如果我们结合你的例子会发生什么:

var name = "foo";

class AnythingYouLike {
  name = "bar";

  sayHello() {
    app.showMessage('Hello ' + this.name); // shows: Hello bar
    app.showMessage('Hello ' + name); // shows: Hello foo
  }
}

namethis.name 在此处都是对两个不同值的有效引用。在 Java 中没有类似的结构可以抗衡。

【讨论】:

  • 但是在第二个例子中,有上下文(周围的类声明)应该意味着 this. 可以隐含,不是吗?
猜你喜欢
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2012-10-02
  • 1970-01-01
  • 2013-07-07
  • 2011-07-11
  • 2013-05-13
相关资源
最近更新 更多