2016-08-02 60 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