2017-03-17 2 views
0

클래스를 구현할 때 생성자 내부에서 구현되는 멤버를 사용할 수 없다는 것을 발견했습니다. 내가 잘못 구현하고 있는지, 정말로 다른 접근법을 취해야하는지 알 수 없습니다.생성자 (typescript)에서 구현 된 멤버 사용 (typescript)

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(); 

생성자에서 구현 된 멤버에 액세스하려면 어떻게해야합니까?

답변

1

기본 클래스 생성자를 자체 실행 중에 파생 클래스의 필드를 볼 수 없습니다.

대신이 패턴을 사용할 수 있습니다 생성자에서 가상 메소드를 호출

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(); 
1

이 :

class Child extends Parent { 
    myVar: number; 

    constructor() { 
     super(); 
     this.myVar = 5; 
    } 
} 

그래서 먼저 아직 할당되지 않은 myVar에 액세스하기 위해 노력하고있는 슈퍼 생성자를 호출 :

class Child extends Parent { 
    myVar: number = 5; 
} 

은 동일합니다.

이것은 또한 컴파일 된 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; 
    } 
} 
+1

아니 큰 팬. 파생 클래스는 기본 클래스 메서드를 호출 할 수 있습니다.이 메서드는 기본 클래스가 여전히 부분 초기화 된 상태이므로 동작이 정의되지 않습니다. –

+0

@RyanCavanaugh 대부분의 경우 당신이 옳았지 만 때로는 피하는 것이 어렵습니다. 어쨌든, 나는 일이 일어나는 순서를 설명하기 위해 여기에 사용했다. –