gpt4 book ai didi

javascript - 为什么 TypeScript 需要 "this."模块的 "internal"前缀?

转载 作者:搜寻专家 更新时间:2023-10-30 21:04:45 25 4
gpt4 key购买 nike

在 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 这样的框架时。 ,这很有意义,因为您可以更好地控制 View 模型模块的生活方式并避免尴尬的错误。一个缺点是你必须在任何地方都使用“this”,这有两个问题:

  1. 将模块从一种样式更改为另一种样式非常乏味。
  2. this. 洒在各处会很吵。

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

最佳答案

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

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

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

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

回应您的评论:

But in the second example, there is context (the surrounding class declaration) that should mean this. can be implied, no?

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 中没有可与之抗衡的类似结构。

关于javascript - 为什么 TypeScript 需要 "this."模块的 "internal"前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37549224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com