为什么TypeScript需要"这个。" "内部"的前缀模块?

时间:2016-05-31 15:01:14

标签: javascript typescript durandal amd

在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;

我使用引号作为我的名字来定义一个模块的不同方法,因为我可以找出"官方"名字已经不复存在了。

使用"瞬态"样式,特别是当使用像Durandal这样的框架时,很有意义,因为你可以更好地控制viewmodel模块的生活方式,避免尴尬的错误。一个缺点是你必须使用"这个"到处都有,这有两个问题:

  1. 将模块从一种风格更改为另一种风格非常繁琐。
  2. 到处散布this.是吵闹的。
  3. 为什么实际上根本需要使用this.,为什么两种风格都不需要它?

1 个答案:

答案 0 :(得分:6)

这不是关于模块的事情,因为它是关于第二种"风格的事实," 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中没有类似的构造要与之抗衡。