gpt4 book ai didi

oop - 在 TypeScript 中访问外部类的成员

转载 作者:搜寻专家 更新时间:2023-10-30 20:35:28 26 4
gpt4 key购买 nike

从 TypeScript 1.6 开始,我们可以使用 class expressions 轻松创建内部类.在其他以 OOP 为中心的语言(如 Java)中,内部类可以访问外部类的成员,even private ones .

这种行为类似于闭包的概念,其中函数可以从定义它的范围访问变量。

为什么我无法在 TypeScript 中实现这一点? ECMAScript 2015 中的类规范在这里起作用吗?

呈现预期行为的代码:

class OuterClass {
private outerField = 1337;

public InnerClass = class {
public accessOuter() {
return this.outerField; // outerField not defined
}
}
}

var outer = new OuterClass();
var inner = new outer.InnerClass();
var win = inner.accessOuter();

最佳答案

如果查看代码的编译 javascript,就更容易理解为什么不能这样做:

var OuterClass = (function () {
function OuterClass() {
this.outerField = 1337;
this.InnerClass = (function () {
function class_1() {
}
class_1.prototype.accessOuter = function () {
return this.outerField; // outerField not defined
};
return class_1;
}());
}
return OuterClass;
}());

如您所见,outerField 被定义为 OuterClass 的成员,如下所示:

this.outerField = 1337;

当您尝试在您的 InnerClass 中访问它时,您会:

return this.outerField;

但是这里的thisclass_1的实例而不是OuterClass所以中没有outerField >这个
此外,您无法从内部类访问外部类的实例。

java中的解决方法是这样的:

class OuterClass {
private int outerField = 1337;

public class InnerClass {
public int accessOuter() {
return OuterClass.this.outerField;
}
}
}

但是在 typescript/javascript 中没有等同于 OuterClass.this.outerField 的东西。
查看 typescript 内部类更像是 java 中的静态内部类,但在这里您也只能访问公共(public)属性:

class OuterClass {
public static outerField = 1337; // has to be public

public InnerClass = class {
public accessOuter() {
return OuterClass.outerField;
}
}
}

您可以将外部类的实例传递给内部类:

class OuterClass {
public outerField = 1337;

public InnerClass = class {
constructor(private parent: OuterClass) {}

public accessOuter() {
return this.parent.outerField;
}
}
}

但同样,您需要将 outerField 公开。


编辑

如果你想实现一些模拟所需行为的东西(也就是说,内部类实例将有权访问私有(private)外部类成员),那么你可以这样做:

interface OuterClassProxy {
outerField: number;
}

interface IInnerClass {}

class OuterClass {
private outerField = 1337;

static InnerClass = class implements IInnerClass {
constructor(private parent: OuterClassProxy) {}

public accessOuter() {
return this.parent.outerField;
}
}

public createInnerClass(): IInnerClass {
let outerClassInstance = this;

return new OuterClass.InnerClass({
get outerField(): number {
return outerClassInstance.outerField;
},
set outerField(value: number) {
outerClassInstance.outerField = value;
}
});
}
}

这是相当多的工作,但它会完成。

关于oop - 在 TypeScript 中访问外部类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38730692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com