例如,我们有一个Dog
类:
class Dog {
static food;
private static static_var = 123;
constructor(private name) {}
speak() {
console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var);
}
}
编译为JS:
var Dog = (function () {
function Dog(name) {
this.name = name;
}
Dog.prototype.speak = function () {
console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var);
};
Dog.static_var = 123;
return Dog;
})();
这同样有效并且不那么复杂:
function Dog(name) {
this.name = name;
}
Dog.prototype.speak = function () {
console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var);
};
Dog.static_var = 123;
使用匿名函数包装器有什么(除“美学”之外)的原因吗?
答案 0 :(得分:6)
两者之间的主要区别与hoisting有关。
TypeScript将类编译为函数表达式到变量的赋值。这意味着生成的构造函数仅在赋值时开始存在。在之前发生的代码中,Dog
将绑定到undefined
。
另一方面,您的实现使用一个需要提升的普通函数 - 该范围内的任何代码,包括在函数之前发生的代码,都可以调用Dog
构造函数。
我想TypeScript更喜欢确保在实际定义类之前不存在类,可能允许在同一范围内的多个点重新定义类。