在原型中声明 TypeScript 成员,而不是添加到“this”中

Declaring TypeScript member in prototype rather than adding to 'this'

本文关键字:添加 this 声明 原型 TypeScript 成员      更新时间:2023-09-26

以下 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)

我知道以这种方式声明可变成员是愚蠢的,但是不可变原语的声明,如 stringnumber ,应该可以在原型上设置,对吧?

可能的解决方法可能是:

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成员。不过问题不大。