在原型中声明 TypeScript 成员,而不是添加到“this”中
Declaring TypeScript member in prototype rather than adding to 'this'
以下 TypeScript:
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)
我知道以这种方式声明可变成员是愚蠢的,但是不可变原语的声明,如 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
为什么类型脚本是这样设计的
仅仅因为对prototype
具有非功能是非惯用的.
(1) 赋值 this.member = "value" 语句不必在每次创建新实例时执行,并且 (2) 实例内存有效负载会更小。
但是查找肯定会变慢。这是一个示例测试: http://jsperf.com/prototype-vs-this-access
我想出了一个也适用于私人成员的解决方法:
class A {
private member: string;
static __init = (() => {
A.prototype.member = "value";
})();
}
这很好;所有代码都在类结构中,我已经避免了强制转换为any
,因此仍然可以跟踪对这些私有成员的引用(用于重构等)。
使用此方法时,将在类函数上声明虚拟__init
成员。不过问题不大。
相关文章:
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在映射数组中添加换行符
- 正在将数据主题添加到所有项目
- 如何在 jquery 上的设置间隔函数中添加“this”
- 将道具添加到..this.ops
- jQuery插件返回this.each并为每个对象添加函数属性
- 在原型中声明 TypeScript 成员,而不是添加到“this”中
- 在 JavaScript/TypeScript 中动态地“直接”添加对象属性到“this”
- 重构 jQuery 以使用 $(this) 并从另一个元素中添加/删除类
- 如何将锚点添加到“this.form.submit();”
- 将变量self而不是this添加到闭包中
- 通过jQuery在正负输入上添加“this”
- 使用$(this)添加不同<p>'s在一组图像的顶部
- 在 JavaScript 中使用 (this) 关键字添加新属性
- 使用jquery在“this”中添加特定元素
- 添加“this.disabled"单击以停止重复的表单提交
- JQuery用onclick()给$(this)添加一个类
- 添加(this)关键字以挑选出一个元素
- 将if添加到AJAX for Rails中(检查this是否==DOM元素)
- 如何创建一个JavaScript“类”,将方法添加到原型中,并正确使用“this”