【发布时间】:2015-01-08 21:32:37
【问题描述】:
以下打字稿:
class A {
member = "value";
}
...编译为:
var A = (function () {
function A() {
this.member = "value";
}
return A;
})();
我想实现以下目标:
var A = (function () {
function A() {
}
A.prototype.member = "value";
return A;
})();
这样做的原因是我相信后一种构造可能更有效,因为 (1) 每次创建新实例时都不必执行赋值 this.member = "value" 语句,以及 (2) 实例内存有效负载会更小。
免责声明:我没有对这两个结构进行基准测试,所以我真的不知道情况是否如此。
所以我的问题是:是否可以使用类型脚本声明“原型成员”?。
如果有人能解释一下为什么字体脚本是这样设计的?,我也很高兴。 (见§8.4.1 in the specification)
我知道以这种方式声明可变成员是愚蠢的,但不可变原语的声明,如 string 和 number,应该可以在原型上设置,对吧?
可能的解决方法是:
class A {
member: string;
}
A.prototype.member = "value";
但是,这不适用于私人会员:
class A {
private member: string;
}
A.prototype.member = "value"; // error TS2107: 'A.member' is inaccessible.
【问题讨论】:
-
在幕后,它本质上不是在构造函数中执行
this.member = A.prototype.member吗?我不认为这样做有性能上的好处,但也许有人肯定知道。对我来说,我宁愿不要为了极小的性能提升而牺牲代码质量。 -
不,不是。如果您要在
prototype上重新分配member,那么该更改将在所有没有明确分配成员值的实例上可见。 -
哦,是的,这是真的。我以前从未尝试将值类型放在原型上,但这是有道理的。顺便说一句,有一个performance benefit during initialization,您添加的属性越多,分配给
this的速度就越慢。 -
甜蜜!感谢您的性能比较!
-
顺便说一下,如果你有少量的查找,它只会在初始化过程中更快。例如,要偏移初始化 6 个字符串,我必须执行 ~30 lookups(在我的计算机上它们是绑定的)。因此,似乎在访问变量 ~5 次之后,执行此方法是不值得的。也许?所以这似乎取决于情况是否值得。我仍然建议不要打扰,因为这些微优化只会导致您的代码更难维护。
标签: javascript typescript