2017-12-06 3 views
0

Ich bin ziemlich neu in TypeScript und es gibt einen Punkt, den ich nicht ganz verstehe.TypeScript - getOwnPropertyNames() - Konstruktor Eigenschaften gegen Getter/Setter

die folgenden Klassen Stellen Sie sich vor:

export class PropertyInConstructor { 

    constructor(public foo: boolean) { 

    } 
} 

export class PropertyWithGetSet { 

    private _foo: boolean = false; 

    get foo(): boolean { 
    return this._foo; 
    } 

    set foo(theFoo: boolean) { 
    this._foo = theFoo; 
    } 
} 

Von meinem Verständnis dieser beiden Ansätze mir beide bieten eine Eigenschaft, die ich new PropertyInConstructor().foo oder new PropertyWithGetSet().foo zugreifen kann.

Ich möchte jetzt die vorhandenen Eigenschaften einer solchen Klasse erhalten und es auszuprobieren (ohne Beispiel!):

console.log(Object.getOwnPropertyNames(PropertyInConstructor.prototype)); 
console.log(Object.getOwnPropertyNames(PropertyWithGetSet.prototype)); 

[ "Konstruktor"]
[ "Konstruktor", "foo"]

Warum enthält der Aufruf, bei dem die Eigenschaften im Konstruktor angegeben werden, nicht die Eigenschaft "foo"?

Gibt es etwas fehlt oder eine andere Möglichkeit, diese Eigenschaften zu bekommen?

+0

Was ich weiß, das erste Beispiel erstellt kein Getter/Setter-Paar. Das zweite Beispiel definiert eigentlich Property für einen Prototyp Sie sehen dies, wenn Sie Ihre Beispiele nach http://www.typescriptlang.org/play/index.html kopieren –

Antwort

2

Kurze Antwort: Die meisten Eigenschaften werden der Instanz dynamisch zur Laufzeit hinzugefügt. Eigenschaften mit Getter und Setter müssen dem Prototyp mit Object.defineProperty hinzugefügt werden.

bei Runtime

Mit Ihrem ersten Beispiel hinzugefügt:

export class PropertyInConstructor { 
    constructor(public foo: boolean) { 
    } 
} 

Die Liegenschaft befindet sich nur auf die Instanz hinzugefügt, wenn der Konstruktor ausgeführt wird. Hier ist die transpiled JavaScript:

var PropertyInConstructor = /** @class */ (function() { 
    function PropertyInConstructor(foo) { 
     this.foo = foo; 
    } 
    return PropertyInConstructor; 
}()); 

Effektiv Eigentum foo erst in den Konstruktor läuft auf die Klasse nicht vorhanden ist.

Das ist nicht nur für Konstruktor Eigenschaften ist, ist es für alle Eigenschaften, die nicht gegen den Prototyp definiert sind, zum Beispiel:

class PropertyInConstructor { 
    public foo: boolean; 
    constructor() { 
     this.foo = true; 
    } 
} 

Property definieren

Wenn Sie bekommen und Satz verwenden, Dinge sind anders, weil die Eigenschaft zum Prototyp hinzugefügt wird:

var PropertyWithGetSet = /** @class */ (function() { 
    function PropertyWithGetSet() { 
     this._foo = false; 
    } 
    Object.defineProperty(PropertyWithGetSet.prototype, "foo", { 
     get: function() { 
      return this._foo; 
     }, 
     set: function (theFoo) { 
      this._foo = theFoo; 
     }, 
     enumerable: true, 
     configurable: true 
    }); 
    return PropertyWithGetSet; 
}()); 
Verwandte Themen