先从现象说起
创建了一个父子类的继承结构,子类在父类基础上会增加若干的成员变量,并在子类非构造方法中给对应的成员变量赋值,这个成员方法实在父类构造函数中调用的,子类继承并重写了该方法;这样就发现子类型实例化以后,增加的成员属性一直是初始值,在上述方法中的赋值没生效。
示例代码
父类:
class A
{
private a: number = 0;
constructor()
{
this.a = 999;
this.initData();
}
public initData()
{
}
}
子类:
class B extends A
{
private b: number = 0;
public initData()
{
this.b = 999;
}
}
测试:
let objectB = new B();
问:objectB.b 最终的值是多少?
看到这里如果已经明确知道值是多少的同学可以不用往下看了,说明你也遇到过类似的问题。
结果
objectB.b 的最终值是 0;是不是很意外?我在遇到这问题之前也以为值应该是 999
分析
出现这个现象主要在如下这行代码上:
private b: number = 0;
表面上看这句话挺平常的,申明了一个成员变量,顺带给了一个初始值;但是配合我们样例中的代码结构,执行顺序就出问题了;
实际运行过程中申明和赋值是分开两步执行的,由于initData是在父类构造函数中调用,对变量b的 赋值操作实际上是在最后,这就是为什么最后值还是为0的原因。