2017-07-11 31 views
0

考慮以下情況:打字稿防止重寫子類屬性

class Parent { 
 
    propStr = "Hello"; 
 
    propNum = 42; 
 

 
    constructor(propShared) { 
 
     console.log(this.propStr); // Hello 
 
     console.log(this.propNum); // 42 
 
     console.log(this.propShared); // w/e 
 
    } 
 
} 
 

 
class Child extends Parent { 
 
    propStr = "Hi"; // overridden 
 
    propNum = 1337; // overridden 
 

 
    constructor(propShared) { 
 
     super(propShared); 
 
    } 
 
} 
 

 
let c = new Child("Foobar");

如何確保父特性適當覆蓋,使得打印的console.log孩子的屬性?

回答

2

您正在從父構造函數中記錄屬性,它們是尚未被在super()之後運行的子構造函數代碼覆蓋。您應該只做初始化的構造函數中,不執行任何毒副作用:

class Parent { 
    propStr = "Hello"; 
    propNum = 42; 

    log() { 
     console.log(this.propStr); 
     console.log(this.propNum); 
    } 
} 

class Child extends Parent { 
    propStr = "Hi"; // overridden 
    propNum = 1337; // overridden 
} 

const c = new Child("Foobar"); 
c.log() 

如果你想初始化依賴於其他地方的選擇,包括兒童類的東西,讓他們的參數。你仍然可以給他們合理的默認值:

class Parent { 
    constructor(propStr = "Hello", propNum = 42, propShared) { 
     this.propStr = propStr; 
     this.propNum = propNum; 
     this.propShared = propShared; 
    } 
    log() { 
     console.log(this.propStr); 
     console.log(this.propNum); 
     console.log(this.propShared); 
    } 
} 

class Child extends Parent { 
    constructor(propShared) { 
     super("Hi", 1337, propShared); 
    } 
} 

const c = new Child("Foobar"); 
c.log();