Javascript 在原型中声明TypeScript成员,而不是添加到';这';
以下类型脚本:Javascript 在原型中声明TypeScript成员,而不是添加到';这';,javascript,typescript,Javascript,Typescript,以下类型脚本: class A { member = "value"; } …编译为: var A = (function () { function A() { this.member = "value"; } return A; })(); 我希望实现以下目标: var A = (function () { function A() { } A.prototype.member = "value"; re
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)实例内存负载将更小
免责声明:我还没有对这两个结构进行基准测试,所以我真的不知道是否是这样
所以我的问题是:是否可以使用类型脚本声明“原型成员”
如果有人能解释为什么类型脚本是这样设计的,我也会很高兴。(见附件)
我理解以这种方式声明可变成员是愚蠢的,但是不可变原语的声明,比如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.
是否可以使用类型脚本声明“原型成员”
不,语言现在不允许这样
解决方法
当编译器不满意时。。。断言:
class A {
private member: string;
}
(<any>A.prototype).member = "value"; // suppressed
A类{
私有成员:字符串;
}
(我提出了一个可能的解决方案,也适用于私人会员:
class A {
private member: string;
static __init = (() => {
A.prototype.member = "value";
})();
}
这很好;所有代码都在类构造中,我避免了转换到any
,因此仍然可以跟踪对这些私有成员的引用(用于重构等)
当使用这种方法时,在类函数上声明了一个虚拟的\uuu init
成员。不过这不是一个大问题。在幕后,它实际上不是在构造函数中执行this.member=A.prototype.member
吗?我不认为这样做对性能有好处,但也许有人知道。对我来说,我不想为了极小的性能提升而牺牲代码质量。不,事实并非如此。如果你在prototype
上重新分配member
,那么在没有显式分配成员值的所有实例上都会看到这种变化。哦,是的,这是真的。我以前从未尝试过在prototype上添加值类型是的,但这是有道理的。顺便说一句,添加的属性越多,分配给这个的速度就越慢。太好了!感谢性能比较!顺便说一句,只有在初始化过程中,如果有少量的查找,它才会更快。例如,为了抵消初始化6个字符串,我不得不这样做(在我的电脑上,它们是并列的)。因此,在访问变量~5次后,似乎不值得使用此方法。也许?因此,这似乎取决于情况是否值得。我仍然建议不要费心,因为这些微优化只会导致代码更难维护。使用any
转换不是一个好方法我的观点。然后我们会忘记该成员的使用位置(重构等)——这是我们首先使用类型脚本的主要原因之一。请您详细说明一下“原型上没有函数是非意识形态的”?我不明白非惯用语的意思:-)i、 e.你不会在野外发现太多的JavaScript代码将成员放在prototype
上。我当然不记得见过任何这样编写的代码。真的吗?我看到了几个这样的用例:(1)设置对象的默认值,作为$.extend()等的替代品。(2)“类”的效率有很多实例。在类型脚本源代码中,有一个地方将非函数成员分配给原型:很好的解决方案!事实上还不错。