为什么TypeScript需要"this"."内部"模块的前缀?

Nei*_*ell 3 javascript amd typescript durandal

在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');
}
Run Code Online (Sandbox Code Playgroud)

"瞬态"生活方式:

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;
Run Code Online (Sandbox Code Playgroud)

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

使用"瞬态"样式,特别是在使用像Durandal这样的框架时,很有意义,因为您可以更好地控制视图模块模块的生活方式并避免尴尬的错误.一个缺点是你必须在任何地方使用"this",这有两个问题:

  1. 将模块从一种样式更改为另一种样式是单调乏味的.
  2. 已经this.洋洋洒洒是嘈杂.

为什么它实际上需要使用this.,为什么两种风格都不需要它?

dre*_*ore 6

这不是关于模块的问题,因为事实上,在第二个"风格"中,它nameAnythingYouLike 该类的成员,而在第一个"风格"中,您将其声明为全局空间中的一个独立变量. .

this在前一种情况下,当你意识到它被该类的特定实例用来引用它自己的时候是有道理的name- this.name,读作:"我的名字".

当然,在第一个例子中没有这样的背景 - 那里,你只是在创造name.

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

回应你的评论:

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

Java以这种方式工作(与其他OOP语言一样),并且thisTS和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
  }
}
Run Code Online (Sandbox Code Playgroud)

name并且this.name这两个值都是有效的引用.在Java中没有类似的构造要与之抗衡.

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