javascript – 为什么TypeScript需要“this.”前缀为“内部”模块?
作者:互联网
在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这样的框架时,很有意义,因为您可以更好地控制视图模块模块的生活方式并避免尴尬的错误.一个缺点是你必须在任何地方使用“this”,这有两个问题:
>将模块从一种样式更改为另一种样式是单调乏味的.
>有这个.洒到处都是吵闹的.
为什么实际上有必要使用它.完全没有,为什么两种风格都不需要呢?
解决方法:
这与模块无关,因为在第二个“样式”中,名称是AnythingYouLike类的成员,而在第一个“样式”中,您将其声明为一个独立变量.全球空间.
在前一种情况下,当你意识到该类的特定实例正在使用它来引用它自己的名字时,这是有意义的 – this.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语言一样),其语义在TS和Java中或多或少相同.但不,这不能隐含在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
}
}
name和this.name在这里都是两个不同值的有效引用.在Java中没有类似的构造要与之抗衡.
标签:durandal,javascript,typescript,amd 来源: https://codeday.me/bug/20190824/1704450.html