打字稿中是否有析构函数
Is there destructor in typeScript
TypeScript 有析构函数吗?如果没有,我怎样才能删除一个对象?
我尝试了 destructor()
和 ~ClassName()
但没有成功。
JavaScript 使用垃圾回收在对象不再被引用时自动删除它们。没有析构函数或终结器的概念。
您无法观察到对象何时被垃圾收集器删除,也无法预测。
你其实可以
class MyClass {
constructor(input1, input2){
this.in1 = input1;
this.in2 = input2;
}
}
let myObject = {};
try {
myObject = {
classHandler: new MyClass('1','2')
}
} catch (e) {
} finally {
delete myObject.classHandler
// garbageCollect
if (global.gc) {global.gc()}
}
从 ES2021 开始,终结器已添加到规范中。
要使用该功能,您需要创建一个 FinalizationRegistry
,它会在任何关联对象被垃圾回收时通知您。
你可以这样使用它:
const reg = new FinalizationRegistry((id: number) => {
console.log(`Test #${id} has been garbage collected`);
});
class Test{
id: number;
constructor(id: number){
this.id = id;
reg.register(this, this.id);
// ^^^^^^^--- This is the "testament", whatever value, which will be passed to the finalization callback
}
}
{
const test1 = new Test(1);
const test2 = new Test(2);
}
注意当回调被调用时,对象已经被垃圾回收了;只有它的“遗嘱”(或者如 MDN 所说,不那么引人注目,“持有的价值”)被提供给终结器。
如果您需要访问终结器中对象的某些属性,您可以将它们存储在遗嘱中,在这种情况下,遗嘱可以(尽管不一定会)在原始对象之后被垃圾回收:
interface TestTestament{
id: number,
intervalid: ReturnType<typeof setInterval>
}
const reg = new FinalizationRegistry((testament: TestTestament) => {
console.log(`Test #${testament.id} has been garbage collected`);
clearInterval(testament.intervalid);
});
class Test{
private testament: TestTestament;
constructor(id: number){
this.testament = {
id,
intervalid: setInterval(() => {
console.log(`Test interval #${id}`);
}, 1000)
};
reg.register(this, this.testament);
}
}
{
const test1 = new Test(1);
const test2 = new Test(2);
}
请注意,规范不保证垃圾回收何时发生,因此如果对象留在内存中,甚至可能不会调用终结器。
TypeScript 有析构函数吗?如果没有,我怎样才能删除一个对象?
我尝试了 destructor()
和 ~ClassName()
但没有成功。
JavaScript 使用垃圾回收在对象不再被引用时自动删除它们。没有析构函数或终结器的概念。
您无法观察到对象何时被垃圾收集器删除,也无法预测。
你其实可以
class MyClass {
constructor(input1, input2){
this.in1 = input1;
this.in2 = input2;
}
}
let myObject = {};
try {
myObject = {
classHandler: new MyClass('1','2')
}
} catch (e) {
} finally {
delete myObject.classHandler
// garbageCollect
if (global.gc) {global.gc()}
}
从 ES2021 开始,终结器已添加到规范中。
要使用该功能,您需要创建一个 FinalizationRegistry
,它会在任何关联对象被垃圾回收时通知您。
你可以这样使用它:
const reg = new FinalizationRegistry((id: number) => {
console.log(`Test #${id} has been garbage collected`);
});
class Test{
id: number;
constructor(id: number){
this.id = id;
reg.register(this, this.id);
// ^^^^^^^--- This is the "testament", whatever value, which will be passed to the finalization callback
}
}
{
const test1 = new Test(1);
const test2 = new Test(2);
}
注意当回调被调用时,对象已经被垃圾回收了;只有它的“遗嘱”(或者如 MDN 所说,不那么引人注目,“持有的价值”)被提供给终结器。
如果您需要访问终结器中对象的某些属性,您可以将它们存储在遗嘱中,在这种情况下,遗嘱可以(尽管不一定会)在原始对象之后被垃圾回收:
interface TestTestament{
id: number,
intervalid: ReturnType<typeof setInterval>
}
const reg = new FinalizationRegistry((testament: TestTestament) => {
console.log(`Test #${testament.id} has been garbage collected`);
clearInterval(testament.intervalid);
});
class Test{
private testament: TestTestament;
constructor(id: number){
this.testament = {
id,
intervalid: setInterval(() => {
console.log(`Test interval #${id}`);
}, 1000)
};
reg.register(this, this.testament);
}
}
{
const test1 = new Test(1);
const test2 = new Test(2);
}
请注意,规范不保证垃圾回收何时发生,因此如果对象留在内存中,甚至可能不会调用终结器。