2016-08-02 59 views
2
class A 
{ 
    protected _value:number; 
    get value() 
    { 
     return this._value; 
    } 
} 

class B extends A 
{ 
    set value(v:number) 
    { 
     this._value = v; 
    } 
} 

var b = new B(); 
b.value = 2; 
console.log(b.value);//undefined 

Playground爲什麼不能吸得超類的屬性[打字稿]

不能得到值,如果子類僅僅只定義制定者。

我想當Object.defineProperty「value」爲B.prototype時,覆蓋A.prototype上的「value」getter setter。

回答

3

關於this accessors' restriction in this thread有一個很長的討論。

對於預期的行爲,無論是留在超類getter和setter方法:

class A 
{ 
    protected _value:number; 

    get value():number 
    { 
     return this._value; 
    } 

    set value(v:number) 
    { 
     this._value = v; 
    } 
} 

class B extends A 
{ 

} 

或替代地同時覆蓋於子類:

class A 
{ 
    protected _value:number; 
    get value():number 
    { 
     return this._value; 
    } 

    set value(v:number) 
    { 
     this._value = v; 
    } 
} 

class B extends A 
{ 

    get value():number 
    { 
     return this._value; 
    } 

    set value(v:number) 
    { 
     this._value = v; 
    } 

} 

如果不使用存取但使用正常的方法,而不是bahaviour如預期:

class A 
{ 
    protected _value:number; 
    getvalue():number 
    { 
     return this._value; 
    } 

} 

class B extends A 
{ 

    setvalue(v:number) 
    { 
     this._value = v; 
    } 

} 

const b:B = new B(); 
b.setvalue(2); 
console.log(b.getvalue()); 
+0

謝謝你的回答。在其他語言中,如果子類沒有一些功能,超類功能將被調用。但打字稿not.i只是混淆了這一點。 – Sxd