Class 在构造函数中使用实现的成员(typescript)
我发现,在实现一个类时,被实现的成员在构造函数中不可用。我不知道我是否实现了错误,或者我是否真的应该采取不同的方法Class 在构造函数中使用实现的成员(typescript),class,typescript,abstract,Class,Typescript,Abstract,我发现,在实现一个类时,被实现的成员在构造函数中不可用。我不知道我是否实现了错误,或者我是否真的应该采取不同的方法 abstract class Parent { abstract myVar: number; constructor() { console.log(this.myVar) // Outputs undefined } f() { console.log(this.myVar) // outputs 5 } } class Child e
abstract class Parent {
abstract myVar: number;
constructor() {
console.log(this.myVar) // Outputs undefined
}
f() {
console.log(this.myVar) // outputs 5
}
}
class Child extends Parent {
myVar: number = 5;
}
let myChild = new Child;
myChild.f();
如何访问构造函数中的这些已实现成员?此:
class Child extends Parent {
myVar: number = 5;
}
相当于:
class Child extends Parent {
myVar: number;
constructor() {
super();
this.myVar = 5;
}
}
因此,首先调用超级构造函数,在其中尝试访问尚未分配的myVar
这在编译的js中也很清楚:
var Parent = (function () {
function Parent() {
console.log(this.myVar);
}
Parent.prototype.f = function () {
console.log(this.myVar);
};
return Parent;
}());
var Child = (function (_super) {
__extends(Child, _super);
function Child() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.myVar = 5;
return _this;
}
return Child;
}(Parent));
如果您希望能够访问Parent
构造函数中的myVar
,您可以执行以下操作:
abstract class Parent {
abstract myVar: number;
constructor() {
this.init();
console.log(this.myVar);
}
f() {
console.log(this.myVar);
}
protected abstract init();
}
class Child extends Parent {
myVar: number;
protected init() {
this.myVar = 5;
}
}
这:
相当于:
class Child extends Parent {
myVar: number;
constructor() {
super();
this.myVar = 5;
}
}
因此,首先调用超级构造函数,在其中尝试访问尚未分配的myVar
这在编译的js中也很清楚:
var Parent = (function () {
function Parent() {
console.log(this.myVar);
}
Parent.prototype.f = function () {
console.log(this.myVar);
};
return Parent;
}());
var Child = (function (_super) {
__extends(Child, _super);
function Child() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.myVar = 5;
return _this;
}
return Child;
}(Parent));
如果您希望能够访问Parent
构造函数中的myVar
,您可以执行以下操作:
abstract class Parent {
abstract myVar: number;
constructor() {
this.init();
console.log(this.myVar);
}
f() {
console.log(this.myVar);
}
protected abstract init();
}
class Child extends Parent {
myVar: number;
protected init() {
this.myVar = 5;
}
}
基类构造函数在其自身执行期间将无法看到派生类的字段 您可以改为使用此模式:
abstract class Parent {
constructor(public myVar: number) {
console.log(this.myVar) // Outputs 5
}
f() {
console.log(this.myVar) // outputs 5
}
}
class Child extends Parent {
constructor() {
super(5);
}
}
let myChild = new Child;
myChild.f();
基类构造函数在其自身执行期间将无法看到派生类的字段 您可以改为使用此模式:
abstract class Parent {
constructor(public myVar: number) {
console.log(this.myVar) // Outputs 5
}
f() {
console.log(this.myVar) // outputs 5
}
}
class Child extends Parent {
constructor() {
super(5);
}
}
let myChild = new Child;
myChild.f();
不太喜欢从构造函数调用虚拟方法。派生类可能会调用基类方法,因为基类仍处于部分初始化状态,因此基类方法的行为将是未定义的。@RyanCavanaugh在大多数情况下您是对的,但有时很难避免。无论如何,我在这里用它来说明事情发生的顺序。我不太喜欢从构造函数调用虚拟方法。派生类可能会调用基类方法,因为基类仍处于部分初始化状态,因此基类方法的行为将是未定义的。@RyanCavanaugh在大多数情况下您是对的,但有时很难避免。无论如何,我在这里用它来说明事情发生的顺序。