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

Playgroundwarum nicht Super Eigentum von Getter get [Typoskript]

kann nicht Wert, wenn Unterklasse nur gerade Setter definieren.

ich denke, wenn Object.defineProperty "Wert" zu B. Prototyp, überschreiben die "Wert" Getter Setter auf A. Prototype.

Antwort

3

Es gibt eine lange Diskussion über this accessors' restriction in this thread.

Für das erwartete Verhalten entweder beide Getter und Setter in der Superklasse verlassen:

class A 
{ 
    protected _value:number; 

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

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

class B extends A 
{ 

} 

oder alternativ außer Kraft setzen sowohl auf der Unterklasse:

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; 
    } 

} 

Wenn Sie nicht Accessoren verwenden Sie aber verwenden Sie normale Methoden stattdessen ist das Verhalten wie erwartet:

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

danke für die antwort. in anderen Sprachen, wenn die Unterklasse keine Funktion hat, wird die Superklassenfunktion aufgerufen. aber typescript not.i verwirren Sie das einfach. – Sxd

Verwandte Themen